日期:2014-05-20  浏览次数:20691 次

怎么让服务端的socket一直处于监听中啊?
我的服务端做成线程,可以正常接受客户端传过来的数据!但是服务端只能
监听一次!我要求服务端一只处于监听中,参照网上的建议,用while(listening=true){...}来一直监听,但是报错java.io.StreamCorruptedException:invalid   Stream   header
这是什么问题?
     


------解决方案--------------------
你搜一下ObjectInputStream,我回答过很多这样的问题了

Object流在创建的时候会产生一个头数据,来标示对象流开始.用循环可以,但不要在循环外面初始化对象流,而是在循环内部创建,也就是说每循环一次都new一下对象流

while(true){
...
ObjectInputStream ois=new ObjectInputStream(inputStream);
ois.readObject();
...
}

发送数据的地方也一样就可以了
------解决方案--------------------
tij2里有例子的
------解决方案--------------------
接受到一个请求就起一个线程,再继续监听
ServerSocket sc=new ServerSocket(8189);
while(true)
{
final Socket socket =sc.accept();
Thread thread=new Thread(new Runnable()
{public void run()
{

try {
OutputStream out = socket.getOutputStream();
PrintWriter pw=new PrintWriter(out,true);
pw.println( "wo kao ");
} catch (IOException ex) {
}

}
});

}
------解决方案--------------------
把 Socket Client=socServer.accept();放到循环里
不就循环监听拉,我前面那个例子,你可以试下~~

------解决方案--------------------
你发送的代码贴出来看看
------解决方案--------------------
问题解决了,我看了下别人的代码
0.ObjectInputStream ois=new ObjectInputStream(fromClient.getInputStream());
这一句都分成2步来做的:
1.ObjectInputStream ois=null 定义成全局变量
2.ois=new ObjectInputStream(fromClient.getInputStream()); 在循环中创建
不知道分开做与一起做的区别在哪里?有点奇怪,感觉没什么区别啊?

--------------------------
一个号不能回复3次,只好又注了个号把结果写出来了
------解决方案--------------------
开始的代码:
Socket Client=socServer.accept(); //这里
while(listenin){
new ChatServer(Client).start();
}
修改后的代码
while(listening){
Socket Client=socServer.accept(); //这里,先后顺序改变了
new ChatServer(Client).start();
}
现在是彻底正常了,写出来给大家参考
------解决方案--------------------
用线程啊................
------解决方案--------------------
import java.io.*;
import java.net.*;
public class MultiThreadServer{
public static void main(String[] args)
{
try
{
//建立通信套接字
ServerSocket serverSocket = new ServerSocket(8000);
int clientNo = 1;
while(true)
{
//监听
Socket connectToClient = serverSocket.accept();
//如果有连接,建立一个线程进行处理
HandleAClient thread = new HandleAClient(connectToClient);
thread.start();
clientNo++;
}
}catch(IOException ex)
{
System.err.println(ex);
}
}
}
//处理客户短消息进程类
class HandleAClient extends Thread{
private Socket connectToClient;
public HandleAClient(Socket socket)
{
connectToClient= socket;
}
public void run()
{
try
{
DataInputStream isFromClient = new DataInputStream(
connectToClient.getInputStrem());