【发布时间】:2019-03-16 17:13:01
【问题描述】:
我最近用 java 编写了一个套接字通信程序,其中两个线程在每个服务器上并发运行,客户端处理对套接字的读取和写入操作,从而允许双方连续发送和接收消息。
问题是客户端或服务器停止接收来自另一端的通信,然后在一段时间后它们都停止工作。我不知道出了什么问题以及连接如何断开:/
服务器代码
import java.net.*;
import java.io.*;
import java.util.Scanner;
public class Server
{
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
private DataOutputStream out = null;
private Scanner inp = null;
String line = "";
String iline = "";
public Server(int port)
{
try
{
server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
// takes input from the client socket
out=new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(new
BufferedInputStream(socket.getInputStream()));
inp = new Scanner(System.in);
while (true)
{
new Thread(new Runnable(){
public void run()
{
try{
while(true){
line = in.readUTF();
System.out.println("Client : "+line);
if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown())
{
System.out.println("DED");
System.exit(0);
}
}
}
catch(Exception e){
System.out.println("Exception !!!");
}
}
}).start();
iline=inp.nextLine();
out.writeUTF(iline);
if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()){
System.out.println("DED");
System.exit(0);
}
}
}
catch(IOException i)
{
System.out.println(i);
}
}
public static void main(String args[])
{
Server server = new Server(5000);
}
}
客户代码
import java.net.*;
import java.io.*;
import java.util.Scanner;
class Client{
private Socket socket =null;
private DataInputStream inp=null;
private DataOutputStream out=null;
private Scanner in=null;
String line="";
String iline="";
Client(String address,int port)
{
try{
socket = new Socket(address,port);
in= new Scanner(System.in);
out = new DataOutputStream(socket.getOutputStream());
inp = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
while(true){
line=in.nextLine();
out.writeUTF(line);
new Thread(new Runnable(){
public void run()
{
try{
while(true){
iline=inp.readUTF();
System.out.println("Server : "+iline);
if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()){
System.out.println("DED");
System.exit(0);
}
}
}
catch(Exception e){
System.out.println("Exception !!!");
}
}
}).start();
if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()){
System.out.println("DED");
System.exit(0);
}
}
}
catch(UnknownHostException u)
{
System.out.println(u);
}
catch(Exception e){
System.out.println("EXCEPTION!!!");
}
}
}
class ClientSocket{
public static void main(String...args){
Client obj = new Client("127.0.0.1", 5000);
}
}
【问题讨论】:
-
只是我在第一个 while(true){} 中看到的代码的初始运行,您正在生成一个线程调用它的 start 方法。在您启动读取线程的那一刻,主线程检查套接字条件并继续前进。由于在您的第一个 while(true) 中有一个 true,因此会再次生成一个新线程,并且该线程会一直运行,直到套接字关闭,程序因 system.exit 调用而终止。
-
@MukeshVerma 感谢您提供的信息 =),我现在明白每次都会产生一个新线程,但我仍然不明白连接是如何关闭的,是否有任何解决方法我正面临着,我应该如何解决它。谢谢你:)
-
@MukeshVerma 我明白了。只是将线程放在while循环之外,它似乎工作正常。产生的新线程开始从套接字读取,主线程继续写入。再次感谢您的帮助^_^
标签: java multithreading sockets networking