在我的应用程序中,我ServerSocket使用一些端口创建一个实例 我完成后,我关闭套接字,但当我尝试ServerSocket在同一个端口上创建一个新的,它会抛出:
"java.net.BindException: Address already in use"
Run Code Online (Sandbox Code Playgroud)
如果我ServerSocket使用不同的端口创建,那么它的工作原理.
ServerSocket.isClosed 也返回true
问题是什么?
public void run() {
try {
BufferedInputStream bufferedinputstream = new BufferedInputStream(
new FileInputStream(fileReq));
BufferedOutputStream outStream = new BufferedOutputStream(
cs.getOutputStream());
byte buffer[] = new byte[1024];
int read;
System.out.println(cs);
while ((read = bufferedinputstream.read(buffer)) != -1)
{
outStream.write(buffer, 0, read);
outStream.flush();
}
System.out.println("File transfered");
outStream.close();
bufferedinputstream.close();
try {
this.finalize();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) 我正在创建一个基于 Java 的服务器。
我正在使用服务器套接字来接受传入消息。
然而,在我的程序中的某个时刻,我希望服务器套接字侦听另一个端口。
我关闭服务器套接字。并用我的新端口开始一个新的端口。一切安好。
但是,当我再次将服务器套接字更改为以前的端口时,会出现错误。
我读过一些内容,服务器套接字在关闭后仍处于超时状态一段时间。
所以这是我的问题:我可以绕过服务器套接字的这种超时状态,并在关闭端口并想要再次侦听同一端口后使端口再次可用吗?
编辑:我的函数用于创建和监听服务器套接字,我的函数用于使服务器套接字无效并在之后立即创建一个新的套接字
public void makeServerSocketWithPort(int portnr) throws IOException, Exception
{
server = new ServerSocket(portnr);
server.setReuseAddress(true);
while(!portchanged)
{
Socket sock = server.accept();
System.out.println(server.getLocalPort());
System.out.println(sock.getLocalPort());
handler = new Requesthandler(sock); //should be in a thread
System.out.println(server.getLocalPort());
System.out.println(sock.getLocalPort());
}
}
public void invalidateRequestHandler(int newPort)
{
if(server != null)
{
portchanged = true;
try {
server.close();
} catch (IOException ex) {
Logger.getLogger(Controlserver.class.getName()).log(Level.SEVERE, null, ex);
}
}
portchanged = false;
makeServerSocketWithPort(newPort);
}
Run Code Online (Sandbox Code Playgroud)
错误堆栈跟踪:
Exception in thread "main" java.net.SocketException: …Run Code Online (Sandbox Code Playgroud) 我有一个正在侦听连接的ServerSocket实例.当客户端连接到它时,我想获得连接套接字的IP,但似乎无法找到正确的方法.
public void start() {
listenSocket = new ServerSocket(port);
connectionSocket = listenSocket.accept();
}
Run Code Online (Sandbox Code Playgroud)
我试过没有运气就打电话给以下人:
connectionSocket.getLocalAddress();
connectionSocket.getInetAddress.getHostAddress();
listenSocket.getLocalSocketAddress();
Run Code Online (Sandbox Code Playgroud)
以上都不会返回正确的IP.它们返回"/ 0:0:0:0:0:0:0:1%0"或"0.0.0.0".
我究竟做错了什么?
我正在尝试创建一个只启动蓝牙的服务器程序,创建服务器套接字,等待某些设备连接并接受连接.
onClick()方法启动蓝牙,然后我调用AcceptThread()方法创建一个服务器套接字并开始监听.然后调用run()接受连接.
但它没有用.我的应用程序停止了.知道为什么吗?
代码如下:
public class MainActivity extends Activity {
public BluetoothAdapter mBluetoothAdapter;
private BluetoothServerSocket mmServerSocket;
private static final UUID MY_UUID_SECURE = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text=(TextView)findViewById(R.id.textView1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.button1:
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
text.setText("Does not support bluetooth");
return;
}
Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
text.setText("Discoverable!!");
AcceptThread(); …Run Code Online (Sandbox Code Playgroud) 在这里,我正在开发一个具有Java套接字的项目,并且在服务器和客户端之间实现正确的时间同步方面存在问题。我将用一个简单的例子来描述问题:
服务器在GMT上运行,并保留包含各种项目的数据库。这些商品中有一些是特价商品,但是这些商品在到期前有时间限制。
因此,假设服务器时间现在是9:00 AM(GMT),并且有一个商品要在10:00 AM(GMT)结束。
客户端可能与服务器位于不同的时间和时区。因此,假设客户时间现在是8:00 AM(GMT-1),我可以花时间将其调整为客户的时区,发现它在9:00 AM(GMT-1)结束,即1个小时。
问题:当用户设置了自定义时间时,如何计算剩余时间。
例如,上述客户端将时钟手动设置为提前半小时,即8:30 AM(GMT-1)。如果您只是进行时区转换,则该商品仍将在9:00(GMT-1)结束,因此,要约完成的剩余时间是错误的(30分钟)。
可能有人说,一种可能的解决方案是将客户端设置为从服务器询问以秒为单位的剩余时间,而不是确切的日期结束。但是我想在客户端实现类似倒数秒的功能。(如果报价在60秒内结束,则界面将变为60,59,58,..,1,0)。因此,每秒向服务器发送一个请求以获取剩余时间并不是有效的网络。
让我担心的另一件事是,如果您确实要求“以秒为单位的剩余时间”,那么在慢速的网络上,服务器的响应将不会立即到来,因此在客户端收到结果之前,时间已经到了。
我有两个java类,一个是服务器,另一个是客户端。假设我需要从服务器向客户端发送 100 MB 的数据。当我发送此消息时,服务器是否会等待客户端读取?如果你看一下代码,服务器的 endTime 变量在客户端读取发送的 100 MB 之前不会起作用吗?
服务器类:
public class MyServerSocket {
private ServerSocket providerSocket;
private Socket connection = null;
private ObjectOutputStream out;
private ObjectInputStream in;
private String message;
public static void main(String[] args) {
MyServerSocket m = new MyServerSocket ();
m.establishConnection();
}
public void establishConnection(){
//SETUP CONNECTION
providerSocket = new ServerSocket(2004, 10);
connection = providerSocket.accept();
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connectiongetInputStream());
//END SETUP CONNECTION
//Suppose this String contains 100 MB
String x = "Send …Run Code Online (Sandbox Code Playgroud) 我一直致力于用 Java 编写 Web Socket 服务器,这一点让我困惑了一段时间。在 GitHub 上,有 TooTallNate 开发的这个库,它是“100% Java 中的准系统 WebSocket 客户端和服务器实现”: https: //github.com/TooTallNate/Java-WebSocket
它拥有大量明星,并且正在积极开发中。
但似乎 Java 的主库中已经有了 websocket 功能?https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java
还有 Jetty 的 WebSocket 之类的东西:http://www.eclipse.org/jetty/documentation/9.4.x/jetty-websocket-server-api.html
还有 Netty,它似乎也有 WebSocket 的东西。
那么它们之间到底有什么区别呢?这是简单性的问题吗?还是性能?或者它们是完全不同的东西?如果我需要低延迟高频发送 5-10 kb 消息,是否有一种最合适的选项?
我已经设置了一个服务器,它通过下面提到的 java 函数侦听加密的字节数组。早些时候,我使用 java (android) 来构建我的应用程序,因此使用相同的 java 函数很容易,但我无法弄清楚该函数的 dart 等效项(flutter)是什么,该函数接受字符串作为输入并返回 AES 加密字节数组作为输出,我可以将其写入 TCP 套接字。
另外,我非常感谢您帮助了解如何将生成的字节数组写入服务器,然后读取类似的响应并通过 dart (颤振)对其进行解密
我已经成功地编写了简单的字符串并通过 dart 接收简单的字符串作为 tcp 服务器的输入和输出,但无法对加密的字节数组执行相同的操作。在java中,我使用DataOutputStream将响应发送到服务器,如下所示
DataOutputStream dOut = newDataOutputStream(socket.getOutputStream());
byte[] s2 = Encrypt3.encrypt2(myString);
dOut.writeInt(s2.length); // write length of the message
dOut.write(s2);
Run Code Online (Sandbox Code Playgroud)
这是我用于aes加密的java函数
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Encrypt3 {
public static String key = "mykey";
public static byte[] encrypt2(String text ){
String encrypt ="";
try{
// Create key and cipher
Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES"); …Run Code Online (Sandbox Code Playgroud) 我想查看我的项目的日志
脚步 :
我克隆了一个套接字应用程序。然后我运行npm install pm2 -g安装 pm2
我跑pm2 start
有用。它显示我的套接字应用程序的表格
但是如果我运行pm2 logs查看日志,则存在如下错误:
1|mycompany | C:\PROGRAM FILES\NODEJS\NPM.CMD:1
1|mycompany | (function (exports, require, module, __filename, __dirname) { :: Created by npm, please don't edit manually.
1|mycompany | ^
1|mycompany |
1|mycompany | SyntaxError: Unexpected token :
1|mycompany | at new Script (vm.js:79:7)
1|mycompany | at createScript (vm.js:251:10)
1|mycompany | at Object.runInThisContext (vm.js:303:10)
1|mycompany | at Module._compile (internal/modules/cjs/loader.js:657:28)
1|mycompany | at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
1|mycompany | at Module.load …Run Code Online (Sandbox Code Playgroud) 有人可以告诉我或给出一个使用WebFlux、RScoket 和 Spring(或 SpringBoot)的现成 CRUD 示例吗?
我研究了RSocket文档WebFlux,也写了我的简单示例,但我希望看到使用RSocket 的基本方法的真实CRUD应用程序。
我会很感激的。谢谢。