Socket编程问题 socketserverexception 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java编程高级进阶里面有提到,现成代码,稍微改下。 服务端package csdn;import java.io.*;import java.net.*;public class TestServer { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(5566); Socket s = ss.accept(); System.out.println("connect"); BufferedReader br = new BufferedReader(new InputStreamReader( s.getInputStream())); PrintWriter pw = new PrintWriter(new OutputStreamWriter( s.getOutputStream())); BufferedReader sin = new BufferedReader(new InputStreamReader( System.in)); //服务端接受客户端信息 String str =br.readLine(); if(str!=null){ System.out.println("client:---" + str); } //服务端回话 System.out.println("请输入一句话"); String st =null; while((st=sin.readLine()) != null) { pw.println(st); pw.flush(); } br.close(); pw.close(); s.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}客户端package csdn;import java.io.*;import java.net.*;public class TestClient { public static void main(String[] args) { try { Socket s = new Socket("localhost", 5566); PrintWriter pw = new PrintWriter(new OutputStreamWriter( s.getOutputStream(),"gbk")); BufferedReader br = new BufferedReader(new InputStreamReader( s.getInputStream(),"gbk")); BufferedReader sin = new BufferedReader(new InputStreamReader( System.in)); //客户端发送信息 System.out.println("请输入一句话"); String ss = null; while ((ss=sin.readLine()) != null) { pw.println(ss); pw.flush();//清除缓存 //接收来自服务端的信息 String str = br.readLine(); System.out.println("Server:---" + str); } pw.flush(); pw.close(); br.close(); s.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}建议还是不用BufferWriter 改用PrintWriter吧 你这里的问题物品我没试 但我记得以前遇到个一个问题:利用BufferedWriter 的writ( String) 写时,在另一边有BufferedReader的readline()读会出现一个问题.即readline()会一直阻塞,因为它读不到结束的标志。解决办法:在write(String) 后在加一句 newLine();还有就是每写一句马上记得fush() 在加一句:所以觉得还是pringWriter好用些 确实是IO流不同的问题引起的服务端:String str=br.readLine(); 首先要了解这个地方什么情况下才会返回,需要读到一行数据才会返回,怎么判断是否有一行数据呢,就是数据需要带有\r\n换行符了解这一点后再看你的客户端是怎么写的bw.write(ss);这里的ss是一段字符串,它并没有以\r\n结尾,所以你需要改成如下即可:if (ss != null) { bw.write(ss + "\r\n"); //手动加上换行符 bw.flush(); //BufferedWriter类带有缓冲功能,所以需要调用该方法把数据马上发送出去}你后面虽然写了 bw.flush(); ,但是被String str = br.readLine();这句代码阻塞了,得不到执行的机会。 内存溢出怎么办?请大家帮忙优化一下 java GUI中,有的属性为什么要加final 滚动条问题 请高手帮忙做个倒记时程序,3Q 强制转换的问题 SSL 和 HTTPS 这些概念该怎么理解? 用Java.AWT的TextField文本框,其中部分文字需要设为斜体,怎么办呢?? 关于setEchoChar()的一个疑问 用.split方法产生的两个问题 类似时间的计算 关于锁的问题 JPanel切换问题
package csdn;import java.io.*;
import java.net.*;public class TestServer { public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(5566);
Socket s = ss.accept();
System.out.println("connect"); BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
s.getOutputStream()));
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
//服务端接受客户端信息
String str =br.readLine();
if(str!=null){
System.out.println("client:---" + str);
}
//服务端回话
System.out.println("请输入一句话");
String st =null;
while((st=sin.readLine()) != null) {
pw.println(st);
pw.flush();
}
br.close();
pw.close();
s.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端
package csdn;import java.io.*;
import java.net.*;public class TestClient { public static void main(String[] args) {
try {
Socket s = new Socket("localhost", 5566);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
s.getOutputStream(),"gbk"));
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream(),"gbk"));
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
//客户端发送信息
System.out.println("请输入一句话");
String ss = null;
while ((ss=sin.readLine()) != null) {
pw.println(ss);
pw.flush();//清除缓存
//接收来自服务端的信息
String str = br.readLine();
System.out.println("Server:---" + str);
}
pw.flush();
pw.close();
br.close();
s.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
建议还是不用BufferWriter 改用PrintWriter吧
但我记得以前遇到个一个问题:利用BufferedWriter 的writ( String) 写时,在另一边有BufferedReader的readline()读会出现一个问题.
即readline()会一直阻塞,因为它读不到结束的标志。
解决办法:在write(String) 后在加一句 newLine();还有就是每写一句马上记得fush()
确实是IO流不同的问题引起的
服务端:String str=br.readLine();
首先要了解这个地方什么情况下才会返回,需要读到一行数据才会返回,怎么判断是否有一行数据呢,就是数据需要带有\r\n换行符
了解这一点后再看你的客户端是怎么写的
bw.write(ss);
这里的ss是一段字符串,它并没有以\r\n结尾,所以你需要改成如下即可:
if (ss != null) {
bw.write(ss + "\r\n"); //手动加上换行符
bw.flush(); //BufferedWriter类带有缓冲功能,所以需要调用该方法把数据马上发送出去
}
你后面虽然写了 bw.flush(); ,但是被String str = br.readLine();这句代码阻塞了,得不到执行的机会。