我正在尝试使用java套接字编写聊天应用程序...
当客户端作为服务器的第一步进入时,概念是服务器在客户端端口上侦听
存储为用户名和客户端的链接套接字为sockettuple
(一个对象,其用户名为字符串,linksocket为socket)
..然后在存储之后发送客户端作为欢迎你连接..服务器监听listenthread
和
通信发生在单独的线程中..对于客户端创建套接字发生在主线程中并且写入服务器发生
在单独的线程中
在这里,套接字元组的存储很好
但是在将消息从服务器发送到客户端Socketclosed exception
时会发生
服务器写入和客户端的读取线程......
// mainserver.java
import java.net.*;
import java.io.*;
class listenthread extends Thread{
ServerSocket mserver;
Socket link,targetsocket;
String user,targetuser;
sockettuple targettuple,starray[]= new sockettuple[10];
int i=0;
public listenthread(ServerSocket mserver){
try{
System.out.println("Inside Listenthread constructor");
this.mserver=mserver;
}
catch (Exception e){
System.out.println("Exception inside listenthread constructor"+e);
}
}
public void run(){
try{
while(true){
System.out.println("Listening.....");
link=mserver.accept();
System.out.println("Accepted");
BufferedReader intosockb = new BufferedReader(new InputStreamReader(link.getInputStream()));
user= intosockb.readLine();
System.out.println(user + "Accepted");
starray[i] =new sockettuple(link,user);
i++;
System.out.println(starray[i-1].username);
new servwrite(link).start();
intosockb.close();
}
}
catch(Exception e){
System.out.println("Exception inside listenthread run "+e);
e.printStackTrace();
}
}
}
class servwrite extends Thread{
Socket link;
public servwrite(Socket link){
this.link=link;
}
public void run(){
try{
PrintStream fromserv=new PrintStream(link.getOutputStream());
fromserv.print("You are connected...Enter the target user:");
}
catch(Exception e){
System.out.println("Exception inside run of serv write thread..."+e);
}
}
}
public class mainserver {
public static void main(String args[]){
try{
ServerSocket Servermain= new ServerSocket(4579);
System.out.println(" Server main Socket created");
new listenthread(Servermain).start();
}
catch(Exception e){
System.out.println("Exception inside main "+e);
}
}
}
//Clientmenu.java
import java.net.*;
import java.io.*;
class clientread extends Thread{
Socket client;
BufferedReader key=null;
public clientread(Socket client){
try{
this.client=client;
key= new BufferedReader(new InputStreamReader(client.getInputStream()));
}
catch(Exception e){
System.out.println("Exception inside client read thread's constructor");
e.printStackTrace();
}
}
public void run(){
try{
System.out.println("First line inside run of client read thread before cmsg readline");
String cmsg= key.readLine();
System.out.println(cmsg);
}
catch(Exception e){
System.out.println("Exception inside run of client read thread..."+e);
e.printStackTrace();
}
}
}
public class Clientmenu {
public static void main(String args[]){
String user=" ";
String targetuser="";
Socket newclient;
BufferedReader fromtheserv;
try{
newclient = new Socket("127.0.0.1",4579);
System.out.print("Enter username:");
BufferedReader key= new BufferedReader(new InputStreamReader(System.in));
user=key.readLine();
PrintStream fromclientp=new PrintStream(newclient.getOutputStream());
fromclientp.print(user);
new clientread(newclient).start();
fromclientp.close();
}
catch(Exception e){
System.out.println("Exception inside CLientmenu "+e);
}
}
}
答案 0 :(得分:4)
关闭"缓冲读卡器"在listenThread和" PrintStream"在clientMenu中导致问题。当您关闭返回的输入/输出流时,底层套接字也会关闭。
Refer to the documentation here
我希望这能解决问题。
答案 1 :(得分:2)
'Socket closed'表示你关闭套接字,然后继续使用它。这是你代码中的一个错误。
请注意,不意味着对等方关闭连接。
您的代码存在许多问题,这里要查看的内容太多了。质量很差。我建议您掌握Java Tutorial的自定义网络路径并对其进行研究,并查看异常处理的最佳实践。目前,您只是捕获某些异常,记录它们,并继续,就像它们没有发生一样。 “catch”块之后的代码不应该依赖于“try”块中发生的事情。
答案 2 :(得分:0)
尝试在listenthread类的run方法中删除此行。
intosockb.close();
正在关闭正在关闭套接字的流。