Java socket的服务端有问题丫
服务端只能接收一次服务端传来的消息,之后再也收不到了,这是肿么回事啊socket java --------------------编程问答-------------------- 楼主的线程有问题
import java.net.*;
import java.io.*;
import java.util.*;
public class SocketServerTest {
private ServerSocket server;
private List<MyClient> clientList = new ArrayList();
public SocketServerTest(){
}
private void startServer()
{
try
{
server=new ServerSocket(6153);
System.out.println("SocketServer Success!!!");
while(true)
{
Socket socket=server.accept();
MyClient client = new MyClient(socket);
client.start();
this.clientList.add(client);
System.out.println("client connect success" + "------members:"+ clientList.size());
}
}catch(Exception e){}
}
/**
* @param args
*/
public static void main(String[] args) {
SocketServerTest server=new SocketServerTest();
server.startServer();
}
class MyClient extends Thread
{
private Socket socket;
private BufferedReader reader;
private DataOutputStream writer;
MyClient(Socket socket)
{
this.socket=socket;
try{
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
writer = new DataOutputStream(socket.getOutputStream());
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
public void run()
{
try
{
String msg = reader.readLine();
if(msg == null)
{
System.out.println("jws~~~");
close();
return;
}
Iterator<MyClient> it = clientList.iterator();
while(it.hasNext()){
MyClient client = it.next();
try{
client.writer.writeUTF(msg);
client.writer.flush();
System.out.println("sendTo message:"+msg);
}catch(Exception e){
client.close();
}
}
}catch(Exception e){
close();
}finally
{
}
}
private void close(){
try
{
clientList.remove(this);
if(reader!=null)reader.close();
if(writer!=null)writer.close();
if(socket!=null)socket.close();
reader=null;
writer=null;
socket=null;
System.out.println("client disconnect");
System.out.println("members:"+clientList.size());
}catch(Exception e){}
}
}
}
线程启动有两种,一种是继承Thread类,一种是实现runnable接口
实现Thread类的线程应该这样启动:
Class A extends Thread
Thread t = new Thread(new A());
t.start();
实现runnable接偶偶的线程应该这样启动:
Class A implements Runnable
A a = new A();
a.start();
所以楼主的错误在于使用第一种实现方法的同时却使用了第二种开始线程的方法,所以线程不会启动。
以上纯属个人观点,谢谢! --------------------编程问答-------------------- 按照你写的,应该是每个客户端链接的时候,会读一次,然后下发多有客户端。是这样的吗? --------------------编程问答-------------------- 你读完一行之后,后面是null就close,
String msg = reader.readLine();
if(msg == null)
{
System.out.println("jws~~~");
close();
return;
} --------------------编程问答-------------------- 不行啊,还是接到一次消息
补充:Java , Java相关