一个Socket通讯的IO问题 自己发现了,是我的一个错误。在发送的时候最后把writer关闭了,就会产生这样的情况,不过不知道这是为什么啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你看一个我写过的程序吧,你修改一下用来传XML多线程中的socket通讯(server的多客户服务)注意点:对象输入输出流的创建时间,和创建顺序需要小心,这可能是大多数人会遇到的问题,applet和servelt通讯时也会有同样的问题。package zzw.test.server;import java.net.*;import java.io.*;/** * <p>服务端管理线程 </p> * <p>用于管理所有和客户端通讯的线程, 每当从客户端接受到请求它会开启一个对应与客户端的服务线程</p> * @auther [email protected] */public class ServerManager extends Thread{ //管理线程主体 public void run(){ ServerSocket server = null; try{ //从8001端口斟听请求 server = new ServerSocket(7788); }catch(IOException ioe){ioe.printStackTrace();} Socket socket = null; System.out.println("开始侦听请求..."); while(true){ try{ //侦听请求 socket = server.accept(); serverThread st = new serverThread(socket); //System.out.println("已经取得请求,开启服务..."); st.start(); }catch(Exception e){ System.out.println("建立侦听出错!"+e.getMessage()); break; } }} public static void main (String[] args) { //server thread manager ServerManager sev = new ServerManager(); sev.start(); }}/** * 服务线程 * 服务于每个客户端请求 * 主要是进行和客户端的套接口通讯 **/class serverThread extends Thread{ private InputStream tin; private OutputStream tout; private ObjectInputStream in; private ObjectOutputStream out; private Socket socket; private int wait; public serverThread(Socket sock){ try{ socket = sock; }catch(Exception e){e.printStackTrace();} } public void run(){ try{ //synchronized(this){ //取得输入输出流,这里必须注意,建立输入输出流必须和客户端对应 tin = new BufferedInputStream(socket.getInputStream()); tout = new BufferedOutputStream(socket.getOutputStream()); in = new ObjectInputStream(tin); out = new ObjectOutputStream( tout ); //} }catch(Exception ee){ System.out.println("取得输入输出流出错:"+ee.getMessage()); } while(true){ //受到请求 String clientRequest; try{ //从输入流读入命令对象 Object getted = in.readObject(); clientRequest = (String)getted; //根据读入的字符串命令响音客户端 if( clientRequest.startsWith( "HELP" ) ){ System.out.println( "server getted command : " + clientRequest ); Thread.sleep(200); //将字符串"server will help you! :)"传送到客户端 out.writeObject( "server will help you! :)" ); out.flush(); }else if( clientRequest.startsWith( "QUIT" ) ){ System.out.println( "server getted command : " + clientRequest ); Thread.sleep(200); out.writeObject( "server closed!" ); out.flush(); break; }else{ if( clientRequest != null ){ System.out.println( "server getted command : " + clientRequest ); } Thread.sleep(200); out.writeObject( "Server can't understand this command!!!" ); out.flush(); } }catch(Exception e){ System.out.println("交互中出错:"+e.getMessage()); break; } }//end while try{ out.close(); in.close(); }catch(Exception e){} }}package zzw.test.client;import java.io.*;import java.net.*;/** * 客户端连接请求管理 * 创建多个socket连接请求线程,并且进行通讯 * 传输对象可以自定义类进行传输不过类必须实现序列化接口 * 客户发送命令给服务器,比如HELP, QUIT(命令服务器结束服务线程)... * @auther [email protected] */public class Client{ public static void main (String[] args) { Client c1 = new Client(); clientThread client=null; String url; int port; //取得参数行 if( args.length == 2 ){ url = args[0]; port = Integer.parseInt( args[1] ); }else{ throw new RuntimeException("参数出错!"); } //进行50次套接口连接请求 for( int i = 1 ; i <= 50 ; i++){ client = new clientThread( url , port , c1); client.start(); try{ Thread.sleep(100); }catch(Exception e){} } /* try{ System.in.read(); }catch(Exception e){} */ }}/** *客户线程 */class clientThread extends Thread{ public static int count = 0; private Object o;//同步器 private String url; private int port; private int wait; public clientThread(String url , int port , Object o){ this.port = port ; this.wait = 100; this.url = url; this.o = o; } public void run(){ //client try{ InputStream in; OutputStream out; ObjectInputStream oin; ObjectOutputStream oout ; //建立过程必须同步,因为同时只能有一个线程在取得连接 synchronized(o){ Socket client = new Socket(url , port); //建立对象输入、出流 in = new java.io.BufferedInputStream(client.getInputStream()); out = new java.io.BufferedOutputStream(client.getOutputStream()); } //取得当前客户线程的名字 String name = this.getName(); System.out.println("\n**************************"+name+"*****************************"); //********************************// //****以下是命令发送和接受应答过程****// //********************************// //1. send Hello object to server oout = new ObjectOutputStream( out ); //可以自定义类进行传输,不过类必须实现序列化接口 System.out.println("----"+name+" send HELLO to server-------"); oout.writeObject( "HELLO from "+name ); oout.flush(); Thread.sleep(wait); //get answer from server oin = new ObjectInputStream( in ); System.out.println( " SERVER RESPONSE : "+oin.readObject()+"\n" ); Thread.sleep(wait); System.out.println("----"+name+" send HELP to server-------"); //2. send "HELP from..."to server,the name of this thread was sent to server. oout.writeObject( "HELP from"+name ); oout.flush(); Thread.sleep(wait); //get answer from server System.out.println( " SERVER RESPONSE : " + oin.readObject()+"\n"); Thread.sleep(wait); System.out.println("---"+name+" send QUIT to server-------"); //3. send QUIT to server,命令服务端对应的服务线程停止 oout.writeObject( "QUIT from"+name); oout.flush(); Thread.sleep(wait); //get answer from server System.out.println( " SERVER RESPONSE : "+ oin.readObject() +"\n"); Thread.sleep(wait); out.close(); oin.close(); count++; System.out.println("目前线程数:"+count); }catch(Exception e){ e.printStackTrace(); } }} java 消息框问题,判断三次 有关package中引用类的问题???大家帮帮忙,多谢啦!!! 麻烦大家看看,这个使用focusLost方法监听事件时焦点混乱执行的原因是什么? 求助:JFace对话框关闭事件的监听 求一个正则表达式,也是字符串重复的问题 如何实现“在启动程序的时候,先显示一张图片,几秒种后自动消失,再显示Frame”的功能。 javamail 特殊的抄送(CC) 在线 帮忙修改时钟程序 散分了 连接池的问题 关于文本文件的小问题! 请教JTextField的Enter问题!
package zzw.test.server;
import java.net.*;
import java.io.*;
/**
* <p>服务端管理线程 </p>
* <p>用于管理所有和客户端通讯的线程, 每当从客户端接受到请求它会开启一个对应与客户端的服务线程</p>
* @auther [email protected]
*/
public class ServerManager extends Thread
{
//管理线程主体
public void run(){
ServerSocket server = null;
try{
//从8001端口斟听请求
server = new ServerSocket(7788);
}catch(IOException ioe){ioe.printStackTrace();}
Socket socket = null;
System.out.println("开始侦听请求...");
while(true){
try{
//侦听请求
socket = server.accept();
serverThread st = new serverThread(socket);
//System.out.println("已经取得请求,开启服务...");
st.start();
}catch(Exception e){
System.out.println("建立侦听出错!"+e.getMessage());
break;
} }}
public static void main (String[] args)
{
//server thread manager
ServerManager sev = new ServerManager();
sev.start();
}
}/**
* 服务线程
* 服务于每个客户端请求
* 主要是进行和客户端的套接口通讯
**/
class serverThread extends Thread{
private InputStream tin;
private OutputStream tout;
private ObjectInputStream in;
private ObjectOutputStream out;
private Socket socket;
private int wait; public serverThread(Socket sock){
try{
socket = sock;
}catch(Exception e){e.printStackTrace();}
} public void run(){
try{
//synchronized(this){
//取得输入输出流,这里必须注意,建立输入输出流必须和客户端对应
tin = new BufferedInputStream(socket.getInputStream());
tout = new BufferedOutputStream(socket.getOutputStream());
in = new ObjectInputStream(tin);
out = new ObjectOutputStream( tout );
//}
}catch(Exception ee){
System.out.println("取得输入输出流出错:"+ee.getMessage());
}
while(true){
//受到请求
String clientRequest;
try{
//从输入流读入命令对象
Object getted = in.readObject();
clientRequest = (String)getted;
//根据读入的字符串命令响音客户端
if( clientRequest.startsWith( "HELP" ) ){
System.out.println( "server getted command : " + clientRequest );
Thread.sleep(200);
//将字符串"server will help you! :)"传送到客户端
out.writeObject( "server will help you! :)" );
out.flush();
}else
if( clientRequest.startsWith( "QUIT" ) ){
System.out.println( "server getted command : " + clientRequest );
Thread.sleep(200);
out.writeObject( "server closed!" );
out.flush();
break;
}else{
if( clientRequest != null ){
System.out.println( "server getted command : " + clientRequest );
}
Thread.sleep(200);
out.writeObject( "Server can't understand this command!!!" );
out.flush();
}
}catch(Exception e){
System.out.println("交互中出错:"+e.getMessage());
break;
}
}//end while
try{
out.close();
in.close();
}catch(Exception e){}
}
}
package zzw.test.client;
import java.io.*;
import java.net.*;/**
* 客户端连接请求管理
* 创建多个socket连接请求线程,并且进行通讯
* 传输对象可以自定义类进行传输不过类必须实现序列化接口
* 客户发送命令给服务器,比如HELP, QUIT(命令服务器结束服务线程)...
* @auther [email protected]
*/
public class Client
{ public static void main (String[] args)
{
Client c1 = new Client();
clientThread client=null;
String url;
int port;
//取得参数行
if( args.length == 2 ){
url = args[0];
port = Integer.parseInt( args[1] );
}else{
throw new RuntimeException("参数出错!");
}
//进行50次套接口连接请求
for( int i = 1 ; i <= 50 ; i++){
client = new clientThread( url , port , c1);
client.start();
try{
Thread.sleep(100);
}catch(Exception e){} }
/*
try{
System.in.read();
}catch(Exception e){}
*/
}
}
/**
*客户线程
*/
class clientThread extends Thread{
public static int count = 0;
private Object o;//同步器
private String url;
private int port;
private int wait;
public clientThread(String url , int port , Object o){
this.port = port ;
this.wait = 100;
this.url = url;
this.o = o;
} public void run(){
//client
try{
InputStream in;
OutputStream out;
ObjectInputStream oin;
ObjectOutputStream oout ;
//建立过程必须同步,因为同时只能有一个线程在取得连接
synchronized(o){
Socket client = new Socket(url , port);
//建立对象输入、出流
in = new java.io.BufferedInputStream(client.getInputStream());
out = new java.io.BufferedOutputStream(client.getOutputStream());
}
//取得当前客户线程的名字
String name = this.getName();
System.out.println("\n**************************"+name+"*****************************");
//********************************//
//****以下是命令发送和接受应答过程****//
//********************************// //1. send Hello object to server
oout = new ObjectOutputStream( out );
//可以自定义类进行传输,不过类必须实现序列化接口
System.out.println("----"+name+" send HELLO to server-------");
oout.writeObject( "HELLO from "+name );
oout.flush();
Thread.sleep(wait);
//get answer from server
oin = new ObjectInputStream( in );
System.out.println( " SERVER RESPONSE : "+oin.readObject()+"\n" );
Thread.sleep(wait); System.out.println("----"+name+" send HELP to server-------");
//2. send "HELP from..."to server,the name of this thread was sent to server.
oout.writeObject( "HELP from"+name );
oout.flush();
Thread.sleep(wait);
//get answer from server
System.out.println( " SERVER RESPONSE : " + oin.readObject()+"\n");
Thread.sleep(wait); System.out.println("---"+name+" send QUIT to server-------");
//3. send QUIT to server,命令服务端对应的服务线程停止
oout.writeObject( "QUIT from"+name);
oout.flush();
Thread.sleep(wait); //get answer from server
System.out.println( " SERVER RESPONSE : "+ oin.readObject() +"\n");
Thread.sleep(wait); out.close();
oin.close(); count++;
System.out.println("目前线程数:"+count); }catch(Exception e){
e.printStackTrace();
} }
}