imprt java.net.*;
import java.io.*;
public class ServerSocket {
public static void main(String [] args) throws exception{
ServerSocket ss = new SeverSocket(8888);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
if(str != null) {
System.out.println(str);
} BufferedWriter bw = new BuffreedWriter(new OutputStreamWriter(s.getOutputSdtream()));
bw.write("hello clinet!!!");
bw.flush();
br.close();
bw.close();
s.colse();
}
}imprt java.net.*;
import java.io.*;
public class ClientSocket {
public static void main(String [] args) throws exception {
Socket s = new Socket("127.0.0.1", 8888);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutStream()));
bw.write(String.valueOf(Math.random()));
bw.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
if(str != null) {
System.out.println(str);
} bw.close();
br.close();
c.close();
}
}我一运行程序客户端和服务器端都阻塞在那里,我关闭一端会出现Connetction reset异常,我把两端的写入流也就是write()之后在后面接着就写bw.flush();bw.close()那么我就能得到先写入一端的数据,但是接着就提是socket closed异常并提示错误行号在br.readLine()这里,我始终没弄清楚这是怎么回事,忘各位高手能帮忙处理小弟这低级的问题!!!
import java.io.*;
public class ServerSocket {
public static void main(String [] args) throws exception{
ServerSocket ss = new SeverSocket(8888);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
if(str != null) {
System.out.println(str);
} BufferedWriter bw = new BuffreedWriter(new OutputStreamWriter(s.getOutputSdtream()));
bw.write("hello clinet!!!");
bw.flush();
br.close();
bw.close();
s.colse();
}
}imprt java.net.*;
import java.io.*;
public class ClientSocket {
public static void main(String [] args) throws exception {
Socket s = new Socket("127.0.0.1", 8888);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutStream()));
bw.write(String.valueOf(Math.random()));
bw.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
if(str != null) {
System.out.println(str);
} bw.close();
br.close();
c.close();
}
}我一运行程序客户端和服务器端都阻塞在那里,我关闭一端会出现Connetction reset异常,我把两端的写入流也就是write()之后在后面接着就写bw.flush();bw.close()那么我就能得到先写入一端的数据,但是接着就提是socket closed异常并提示错误行号在br.readLine()这里,我始终没弄清楚这是怎么回事,忘各位高手能帮忙处理小弟这低级的问题!!!
bw.write(String.valueOf(Math.random()));
bw.newLine();//添加这一行,写入一个换行符
bw.flush();
import java.io.*;
public class TestClientSocket {
public static void main(String[] args) throws Exception {
Socket socket = null;
try {
socket = new Socket("127.0.0.1 ", 8888);
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket
.getOutputStream());
new Thread(new ReceiveRunnable(dis)).start();
new Thread(new SendRunnable(dos)).start();
} catch (Exception e) {
if (socket != null)
socket.close();
}
}
}class SendRunnable implements Runnable {
DataOutputStream dos = null; public SendRunnable(DataOutputStream dos) {
super();
this.dos = dos;
} public void run() {
StringBuffer string = new StringBuffer();
;
try {
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = "";
while (!(line=br.readLine()).equals("#")) {// 简单的从控制台上获取结果 // "#"意味着输入结束,开始向对方发送数据
string.append(line);
string.append("\n");
}
dos.writeUTF(string.toString());// 写出dos流
string.delete(0, string.length());
}
} catch (IOException e) {
} finally {
try {
if (dos != null)
dos.close();
} catch (IOException e) {
}
}
}
}class ReceiveRunnable implements Runnable {
DataInputStream dis = null; public ReceiveRunnable(DataInputStream dis) {
super();
this.dis = dis;
} public void run() {
String string = null;
try {
while (true) {
string = dis.readUTF();// 读取dis流
System.out.println(string);// 简单的把结果显示在控制台上
}
} catch (IOException e) {
} finally {
try {
if (dis != null)
dis.close();
} catch (IOException e) {
}
}
}
}//测试结果
/*我是 客户端
发信息 给服务器
#
我是 服务器
发信息 给客户端*/
//TestServerSocket.java
import java.net.*;
import java.io.*;public class TestServerSocket {
public static void main(String[] args) throws Exception {
Socket socket = null;
try {
ServerSocket ss = new ServerSocket(8888);
socket = ss.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket
.getOutputStream());
new Thread(new ReceiveRunnable(dis)).start();
new Thread(new SendRunnable(dos)).start();
} catch (Exception e) {
if(socket != null)socket.close();
}
}
}//测试结果
/*我是 客户端
发信息 给服务器我是 服务器
发信息 给客户端
#
*/
所以在发送数据的时候,要记得也发送换行符号。
如果在同样的操作系统中,一般问题不大,要是在不同的操作系统,就要注意换行符的协调,比如window和linux的换行符就不一样,这时linux发送的数据,可能window读取是会一直堵塞,所以要注意。
我一运行程序客户端和服务器端都阻塞在那里,我关闭一端会出现Connetction reset异常,我把两端的写入流也就是write()之后在后面接着就写bw.flush();bw.close()那么我就能得到先写入一端的数据,但是接着就提是socket closed异常并提示错误行号在br.readLine()这里,我始终没弄清楚这是怎么回事,忘各位高手能帮忙处理小弟这低级的问题!!!readLine()方法是阻塞式的方法,通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 但是你只是bw.write(String.valueOf(Math.random())); 没有写换回或回车。这个时候服务器短实际上是接受到客户端了,也就是服务器端运行到这里了String str = br.readLine(); 但是客户端这个时候已经运行完毕,并且关闭了连接。所以就会出现Connetction reset的异常。你bw.write(String.valueOf(Math.random())+"\n")这样写就没有错。
这个时候你会问服务器短也是bw.write(String.valueOf(Math.random()))没有写换行和回车之类的,但是客户端为什么没错误呢。隐身服务器短write完,flush()后面有close了。所以客户端也是可以接受到服务器端传过来的信息。如果你把close注释掉,再执行肯定也会错误的。