【发布时间】:2014-03-01 23:37:48
【问题描述】:
我正在尝试使用 Java 套接字编写聊天应用程序...
概念是当客户端进入时,服务器在客户端侦听端口作为服务器的第一步
存储为用户名和客户端的链接套接字为sockettuple(一个将用户名作为字符串和链接套接字作为套接字的对象)
..然后在存储后发送客户端欢迎您连接..服务器在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);
}
}
}
【问题讨论】:
-
转储整个代码并要求我们解决它不是在这里提问的好方法。只发布相关代码。