Java basic并发通信器-不完全接受连接
我想创建一个简单的通信器,只有一台服务器和几个可以连接并向其发送数据的客户端。没有任何线程,只有一个客户机,它可以正常工作,但一旦我尝试合并并发性,它就不起作用了。从客户端的角度来看,有一些连接,我可以发送数据,但并没有迹象表明服务器上收到了那个些数据。以下是服务器类:Java basic并发通信器-不完全接受连接,java,sockets,concurrency,Java,Sockets,Concurrency,我想创建一个简单的通信器,只有一台服务器和几个可以连接并向其发送数据的客户端。没有任何线程,只有一个客户机,它可以正常工作,但一旦我尝试合并并发性,它就不起作用了。从客户端的角度来看,有一些连接,我可以发送数据,但并没有迹象表明服务器上收到了那个些数据。以下是服务器类: import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socke
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class MyServerSocket implements Runnable
{
private ServerSocket serverSocket;
public MyServerSocket() throws Exception
{
Random generator = new Random();
this.serverSocket = new ServerSocket(generator.nextInt(65000 - 60000) + 60000, 50, InetAddress.getByName("192.168.0.105"));
}
public InetAddress getSocketIPAddress()
{
return this.serverSocket.getInetAddress();
}
public int getPort()
{
return this.serverSocket.getLocalPort();
}
public void run()
{
while (true)
{
System.out.println("Running a thread");
try
{
String data = null;
Socket client = this.serverSocket.accept();
String clientAddress = client.getInetAddress().getHostName();
System.out.println("Connection from: " + clientAddress);
System.out.println("Here I am");
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String message = "";
while ((data = in.readLine()) != null && data.compareToIgnoreCase("quit") != 0)
{
message = ("\r\nMessage from " + clientAddress + ": " + data);
System.out.println(message);
out.write(message);
}
} catch (Exception e)
{
System.out.println("Something went wrong");
} finally
{
try
{
serverSocket.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
主服务器:
import java.lang.Thread;
public class Main
{
public static void main(String[] args)
{
try
{
MyServerSocket socket = new MyServerSocket();
Runnable runnable = new MyServerSocket();
System.out.println("Port number: " + socket.getPort() + " IP address: " + socket.getSocketIPAddress());
Thread thread = new Thread(runnable);
thread.start();
}catch (Exception e)
{
e.printStackTrace();
}
}
}
客户端类:
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class ClientSocket
{
private Socket socket;
private Scanner scanner;
ClientSocket(InetAddress serverAddress, int serverPort) throws Exception
{
this.socket = new Socket(serverAddress, serverPort);
this.scanner = new Scanner(System.in);
}
public void sendData() throws Exception
{
String data;
System.out.println("Please type in the message. If you want to terminate the connection, type Quit");
PrintWriter out = new PrintWriter(this.socket.getOutputStream(), true);
do
{
data = scanner.nextLine();
out.println(data);
out.flush();
}while(data.compareToIgnoreCase("quit") != 0);
out.println();
}
}
主客户端:
import java.net.InetAddress;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int port;
System.out.println("Provide port at which you will communicate with the server");
port = scanner.nextInt();
try
{
ClientSocket socket1 = new ClientSocket(InetAddress.getByName("192.168.0.105"), port);
socket1.sendData();
}catch(Exception e)
{
System.out.println("Could not connect to the server.");
}
}
}
当即将接受客户端连接时,服务器会以某种方式停止工作,而客户端工作正常并且似乎已连接到服务器。在服务器端,一旦接受客户端连接,您应该新建一个线程来处理此连接:
import java.io.*;
导入java.net.InetAddress;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.Random;
公共类MyServerSocket实现可运行{
私有服务器套接字服务器套接字;
public MyServerSocket()引发异常{
随机生成器=新随机();
this.serverSocket=newserversocket(generator.nextInt(65000-60000)+60000,50,InetAddress.getByName(“192.168.0.105”);
}
公共地址getSocketIPAddress(){
返回此.serverSocket.getInetAddress();
}
公共int getPort(){
返回此.serverSocket.getLocalPort();
}
公开募捐{
while(true){
System.out.println(“运行线程”);
try(套接字客户端=this.serverSocket.accept()){
//处理此客户端的新线程
新线程(()->{
试一试{
字符串数据=null;
字符串clientAddress=client.getInetAddress().getHostName();
System.out.println(“连接源:“+clientAddress”);
System.out.println(“我在这里”);
BufferedReader in=新的BufferedReader(新的InputStreamReader(client.getInputStream());
BufferedWriter out=新的BufferedWriter(新的OutputStreamWriter(client.getOutputStream());
字符串消息=”;
while(true){
如果(!((data=in.readLine())!=null和&data.compareTignoreCase(“退出”)!=0))中断;
消息=(“\r\n来自“+clientAddress+”:“+data”的消息);
System.out.println(消息);
写出(信息);
}
}捕获(IOE异常){
System.out.println(“出错”);
}
}).start();
}捕获(例外e){
System.out.println(“出错”);
}
}
}
}
好的,我以某种方式解决了这个问题,但我仍然需要了解它是如何工作的:
如果有人能指出这个最终版本代码中仍然存在的错误,我将不胜感激。仍然有相同的输出。@SzK抱歉,我忘记删除您的
finally
片段,您不应该在接受客户端连接后关闭serverSocket。我有更新代码,您可以尝试我的新代码片段。@SzK您从未显示程序输出的内容。我只能猜测你的意图,我认为我的服务器端代码是正确的。@Szk你可以尝试修改你的主代码作为你的后续自我应答。如果运行一个带有start
的线程,并且主线程立即退出,那么服务器程序永远不会真正完全启动。这不是我的服务器端代码的问题,请尝试参考资料,它只关闭与一个特殊客户机的连接。服务器类的一切都很好—问题在于主类。终于一切顺利了,谢谢你的帮助。
public class Main
{
public static void main(String[] args)
{
try
{
MyServerSocket socket = new MyServerSocket();
System.out.println("Port number: " + socket.getPort() + " IP address: " + socket.getSocketIPAddress());
socket.run();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}