菜鸟求帮忙(和 I/O 线程 有关 )
本帖最后由 kankanpian 于 2012-12-02 01:45:35 编辑 代码如下:
A:
import java.util.LinkedList;
public class ServerMain
{public int duanKou;
public String zhuanTai;
public LinkedList<String> userList;
public static void main(String[] args)
{
ServerMain svm = new ServerMain();
Thread th1 = new InPutThread(svm);
th1.start();
}
}
a:
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class InPutThread extends Thread
{
private ServerMain serverMain;
private ServerSocket serverSocket;
private Socket socket;
public InPutThread(ServerMain serverMain)
{
this.serverMain = serverMain;
try
{
this.serverSocket = new ServerSocket(5000);
this.socket = serverSocket.accept();
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void getUserName() throws Exception
{
InputStream ipt = this.socket.getInputStream();
BufferedInputStream bfip = new BufferedInputStream(ipt);
byte[] bt = new byte[1000];
int length = 0;
while (-1 != (length = bfip.read(bt, 0, 1000)))
//先运行ServerMain 再运行ClientMain 程序运行到上面这行发生错误了?
/** 错误如下:
* java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at Sever.InPutThread.getUserName(InPutThread.java:51)
at Sever.InPutThread.run(InPutThread.java:69)
*
*
*/
{
String str = new String(bt, 0, length);
System.out.println(str);
}
}
@Override
public void run()
{
try
{
this.getUserName();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
B:
public class ClientMain
{
private String userName = "user1";
public String getUserName()
{
return userName;
}
public static void main(String[] args)
{
ClientMain clm = new ClientMain();
new OutPutThread(clm).start();
}
}
b:
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class OutPutThread extends Thread
{
private Socket socket;
private ClientMain clientMain;
public OutPutThread(ClientMain clientMain)
{
this.clientMain = clientMain;
try
{
this.socket = new Socket("127.0.0.1", 5000);
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void sendName() throws Exception
{OutputStream opt = this.socket.getOutputStream();
BufferedOutputStream bfopt = new BufferedOutputStream(opt);
String str = this.clientMain.getUserName();
byte[] bt = str.getBytes();
bfopt.write(bt);
}
@Override
public void run()
{
try
{
this.sendName();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
哪位高手帮忙解答一下!
[最优解释]
楼主的代码,客户端只发送一条信息,就退出了(自然连接就关闭了),而服务器端,是用while()循环接收信息,所以当客户端有退出后,就报异常了。
改一下代码,可正常结束:
1 把InPutThread.java 的方法getUserName()改一下:
private void getUserName() throws Exception
{
InputStream ipt = this.socket.getInputStream();
BufferedInputStream bfip = new BufferedInputStream(ipt);
byte[] bt = new byte[1000];
int length = 0;
length=bfip.read(bt,0,1000);//就读一条就结束.
//while (-1 != (length = bfip.read(bt, 0, 1000)))
String str = new String(bt, 0, length);
System.out.println(str);
}
bfopt.write(bt);
bfopt.flush();//加这句,否则数据在缓冲区里,没有满就不发送。