我的服务端做成线程,可以正常接受客户端传过来的数据!但是服务端只能
监听一次!我要求服务端一只处于监听中,参照网上的建议,用while(listening=true){...}来一直监听,但是报错java.io.StreamCorruptedException:invalid Stream header
这是什么问题?
监听一次!我要求服务端一只处于监听中,参照网上的建议,用while(listening=true){...}来一直监听,但是报错java.io.StreamCorruptedException:invalid Stream header
这是什么问题?
...
ObjectInputStream ois=new ObjectInputStream(inputStream);
ois.readObject();
...
}发送数据的地方也一样就可以了
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) {
} }
}); }
int port = 10000; //建立通信的主机的端口号
ServerSocket socServer = null;
try{
socServer = new ServerSocket(port);
Socket Client=socServer.accept();
while(true){
new ChatServer(Client).start();
}}...
public void run(){
try{
ObjectInputStream ois=new ObjectInputStream(fromClient.getInputStream());
//对客户端传过来的数据进行处理
String mess=(String)ois.readObject();...
} }
我是在循环里面新建的啊
不就循环监听拉,我前面那个例子,你可以试下~~
String addpath=null;
String delpath=null;
UserInfo user=null;
CommonMethod pro=new CommonMethod(); //通过socket把数据从客户端写到服务端(在每个代理上都开一个socket用来监听数据)
public void addUser(String addpath,UserInfo user){
String addmessage="客户端向服务段写数据:增加";
int port=10000;
Socket socket=null;
try{
socket=new Socket("192.168.2.79",port);
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(addmessage);
oos.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
发送的代码
private Socket fromClient=null;//主机与客户机的通信套节字:fromClient
private static boolean listening=true;
public ChatServer(Socket client){
fromClient=client;
}
public static void main(String[] args) {
int port = 10000; //建立通信的主机的端口号
ServerSocket socServer = null;
try{
socServer = new ServerSocket(port);
Socket Client=socServer.accept();
while(listenin){
new ChatServer(Client).start();
}
}catch (IOException e){
System.err.println("Could not listen on port: "+port);
System.exit(1);
}
} public void run(){
try{
ObjectInputStream ois=new ObjectInputStream(fromClient.getInputStream());
//对客户端传过来的数据进行处理
String mess=(String)ois.readObject();
String []data=mess.split(",");
CommonMethod oper=new CommonMethod();
if(mess!=null&&data[0].equals("add")){
oper.IniFile("D://ftp-date//AccInfo.ini");
UserInfo user=new UserInfo();
AcceptParPro par=new AcceptParPro();
user=par.process(data);
System.out.print(mess);
oper.addUserInfo(user);
oper.save2();
}
}
ois.close();
fromClient.close();//关闭套节字前要关闭所有的流连接
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
接受的代码...
谢谢你的回复,我看用DateObjectOutputStream能解决吗?不行我就用你说的OutPutStream
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.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());
DataOutputStream osToClient = new DataOutputStream(connectToClient.getOutputStream());
while(true)
{
//业务逻辑
}
}catch(IOException ex)
{
System.err.println(ex);
}
}
}