首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

初学者求帮忙(和 I/O 线程 有关 )

2012-12-15 
菜鸟求帮忙(和I/O线程 有关)本帖最后由 kankanpian 于 2012-12-02 01:45:35 编辑代码如下:A:import java.u

菜鸟求帮忙(和 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);

}


2 把发送端,发送完数据加上一条语句:

bfopt.write(bt);
bfopt.flush();//加这句,否则数据在缓冲区里,没有满就不发送。

[其他解释]
引用:
楼主的代码,客户端只发送一条信息,就退出了(自然连接就关闭了),而服务器端,是用while()循环接收信息,所以当客户端有退出后,就报异常了。
改一下代码,可正常结束:
1 把InPutThread.java 的方法getUserName()改一下:
Java code??123456789101112private void getUserName() throw……


谢谢 原来是没有.flush  或者没有关闭流的问题。

热点排行