我正在尝试在服务器套接字上打开多个端口,以便我可以连接多个客户端。每次我创建一个线程并启动它(我知道将调用重写的run方法)我打开一个端口并监听客户端。
但问题是,当我运行客户端套接字项目并尝试连接到我在服务器中打开的端口时,它会显示java.net.connectException : connection refused:connect
。
我也注意到了一个奇怪的事情。每次运行“服务器代码”时,控制台窗口中的输出都不同
我在过去的3天里一直在研究这个问题,我猜不出任何想法。
注意:这个问题对我来说是独一无二的,因为我在这个论坛上没有找到这个特殊的问题,所以请善待,因为我是java和socket编程的新手虽然我已经在c ++编写了很长一段时间了
服务器套接字
import java.io.*;
import java.net.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.*;
public class TryThreads extends Thread
{
private int Portnumber;
private static String inputLine;
public TryThreads(int portNumber)
{
Portnumber = portNumber;
setDaemon(true);
}
public static void main(String[] args)
{
//create three threads
Thread first = new TryThreads(63400);
Thread second = new TryThreads(63401);
first.start();
second.start();
//third.start();
System.out.println("ending main");
return;
}
public void run()
{
try
{
System.out.println("one socket port opened");
ServerSocket serverSocket = new ServerSocket(Portnumber);
System.out.println("one socket port opened");
while (true)
{
System.out.println("ending main2");
//System.out.println("one socket port opened");
Socket clientSocket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
while((inputLine = bufferedReader.readLine()) != null)
System.out.println(inputLine);
}
}
catch(IOException e)
{
System.out.println(e);
}
}
}
客户端套接字
import java.io.*;
import java.net.Socket;
public class client
{
private static PrintWriter printWriter;
public static void main(String[] args)
{
BufferedReader in = null;
try
{
Socket socket = new Socket("localhost",63400);
printWriter = new PrintWriter(socket.getOutputStream(),true);
printWriter.println("Hello Socket");
printWriter.println("EYYYYYAAAAAAAA!!!!");
}
catch(Exception e)
{
System.out.println(e);
}
}
}
答案 0 :(得分:3)
在TryThreads
构造函数中,使用:
setDaemon(false);
您已将服务器线程设置为守护程序线程,因此只要main
退出,它们就会终止,因此您的服务器会在您启动它时立即停止。
当运行的唯一线程都是守护程序线程时,Java虚拟机退出。
<小时/> 顺便说一句,在纠正上述问题后,请注意您的实现将导致服务器收到“连接重置”
SocketException
,这将使您的服务器线程脱离其循环并阻止其接受其他异常。您可以在退出前通过执行socket.close()
在客户端修复此问题,以确保正常关闭,但您仍然希望在服务器端修复它,因为您不能认为客户端会表现良好。
答案 1 :(得分:0)
通常,只要您想使用PrintWriter编写消息,就需要在完成后刷新它(printwriter.flush())。这样可以确保邮件已发送。