小弟遇到一个问题怎么也想不通!
是一个关于简陋聊天小程序,一个Server,一个Client;
在Server端向Client输出数据的时候,我先用PrintWriter流,结果正确实现目的.可是,我后来改用BufferedWriter流,调用
其write方法写一字符串出去(马上后面跟flush),但是Client却接受不到数据,程序傻死在那里,调试了半天也找不到原因,请各位高手赐教,不胜感激,谢谢!!!
是一个关于简陋聊天小程序,一个Server,一个Client;
在Server端向Client输出数据的时候,我先用PrintWriter流,结果正确实现目的.可是,我后来改用BufferedWriter流,调用
其write方法写一字符串出去(马上后面跟flush),但是Client却接受不到数据,程序傻死在那里,调试了半天也找不到原因,请各位高手赐教,不胜感激,谢谢!!!
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
这是里面主要改动地方
import java.io.*;
import java.net.*;
public class TalkServer {
public static void main(String[] args) {
try{
ServerSocket ss = new ServerSocket(5888);
while(true) {
Socket s = ss.accept();
System.out.println("a client connected");
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
//PrintWriter pw = new PrintWriter(s.getOutputStream());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String s1, s2;
s1 = br.readLine();
System.out.println("client: " + s1);
InputStreamReader isr2 = new InputStreamReader(System.in);
BufferedReader br2 = new BufferedReader(isr2);
while(true) {
s2 = br2.readLine();
//pw.println(s2);
//pw.flush();
bw.write(s2);
bw.flush();
if(s2.compareToIgnoreCase("bye") == 0) {
break;
}
s1 = br.readLine();
System.out.println("Client: " + s1);
}
br.close();
br2.close();
//pw.close();
bw.close();
s.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}client:
import java.io.*;
import java.net.*;public class TalkClient {
public static void main(String[] args) {
try{
Socket s = new Socket("222.71.35.61",5888); InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(s.getOutputStream()); String s1, s2;
InputStreamReader isr2 = new InputStreamReader(System.in);
BufferedReader br2 = new BufferedReader(isr2);
s2 = br2.readLine();
pw.println(s2);
pw.flush();
while(true) {
s1 = br.readLine();
System.out.println("Server: " + s1);
s2 = br2.readLine();
pw.println(s2);
pw.flush();
if(s2.compareToIgnoreCase("bye") == 0) {
break;
}
}
br.close();
br2.close();
pw.close();
s.close(); } catch(Exception e) {
e.printStackTrace();
} }
}
import java.io.*;
import java.net.*;public class TalkClient {
public static void main(String[] args) {
try{
Socket s = new Socket("222.71.35.61",5888); InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(s.getOutputStream()); String s1, s2;
InputStreamReader isr2 = new InputStreamReader(System.in);
BufferedReader br2 = new BufferedReader(isr2);
s2 = br2.readLine();
pw.println(s2);
pw.flush();
while(true) {
s1 = br.readLine();
System.out.println("Server: " + s1);
s2 = br2.readLine();
pw.println(s2);
pw.flush();
if(s2.compareToIgnoreCase("bye") == 0) {
break;
}
}
br.close();
br2.close();
pw.close();
s.close();
} catch(Exception e) {
e.printStackTrace();
} }
}
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;public class ChatClient extends Frame {
TextField tfTxt = new TextField();
TextArea taContent = new TextArea();
String IPAddress=null;
//此String 型变量用来提取由构造函数所引入的IP地址
Socket s=null;//成员变量,解决在send信息时的问题
DataOutputStream dos=null;
DataInputStream dis=null;
private boolean bConnected=false;
//构造函数用来提取IP
public ChatClient(String IP){
IPAddress=IP;
}
//Main Function
public void mainfunction(){
//public static void main(String[] args) {
new ChatClient(IPAddress).launchFrame();
}
public void launchFrame() {
setLocation(400, 300);
this.setSize(300, 300);
this.setTitle("嘻嘻QQ-聊天");
add(tfTxt, BorderLayout.SOUTH);
add(taContent, BorderLayout.NORTH);
pack();
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
disconnect();
System.exit(0);
}
});
tfTxt.addActionListener(new TextFieldListener());
setVisible(true);//设置显示属性为可见
connect();//连接
new Thread(new RecvThread()).start();//线程启动
}
//建立连接服务器端的连接的方法
public void connect(){
try{
s=new Socket(IPAddress,8888);
dos=new DataOutputStream(s.getOutputStream());
dis=new DataInputStream(s.getInputStream());
System.out.println("3:登陆成功");
bConnected=true;
}catch(UnknownHostException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
//清理结束时的资源
public void disconnect(){
try{
dos.close();
dis.close();
s.close();
}catch(IOException e){
e.printStackTrace();
}
}
private class TextFieldListener implements ActionListener{
public void actionPerformed(ActionEvent e){
String str=new Date()+"--"+tfTxt.getText().trim();
//去掉两边的空格,然后提取
tfTxt.setText("");
try{
//dos=new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
dos.flush();//良好编程习惯
//dos.close();
}catch(IOException e1){
e1.printStackTrace();
}//写出字符串
}
}//TextField监听
private class RecvThread implements Runnable{
public void run(){
while(bConnected){
try{
String str=dis.readUTF();
//taContent.setText(taContent.getText()+str+"\n");
String message=str;
taContent.append("\n"+str);
taContent.setCaretPosition(taContent.getText().length());
}catch(SocketException e){
bConnected=false;
System.out.println("4:与服务器连接已经断开");
}catch(EOFException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}//end of catch
}
}//end void run()
}
}
-----------------------------------------------
登陆注册截面就不发出了!
最后查了下jdk的源码
bw.write(s2);
bw.write("\n");
bw.flush();
要换行才行,因为你的另一方是readline即读一行嘛.
/**
* Terminates the current line by writing the line separator string. The
* line separator string is defined by the system property
* <code>line.separator</code>, and is not necessarily a single newline
* character (<code>'\n'</code>).
*/
public void println() {
newLine();
}
关键就在这呢
private void newLine() {
try {
synchronized (lock) {
ensureOpen();
out.write(lineSeparator);
if (autoFlush)
out.flush();
}
}
BufferedWriter在write后不会输出换行符合的.PrintWriter会输出,重方法名上也看得出来,不过有的时候不一定会联想到,这时候可以debug跟踪下源码.
System.getProperty("line.separator")BWT:你最后完善下你程序了,读起来真累,中途差点想放弃回答这个问题.
我重写过一个给你看看,用多线程的,一个线程写,一个线程收
Server:package example.socket.test;
import java.io.*;
import java.net.*;
public class EchoServer {
public static void main(String[] args) throws IOException{
ServerSocket s = new ServerSocket(8888);
try{
while(true){
Socket socket=s.accept();
new writerserver(socket).start();
new getserver(socket).start();
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
class writerserver extends Thread{
private PrintWriter pw = null;
private BufferedReader br = null;
private Socket socket = null;
public writerserver(Socket socket){
this.socket = socket;
try{
pw = new PrintWriter(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(System.in));
}catch(Exception e ){
System.out.println(e.getMessage());
}
}
public void run(){
while(true){
try{
String str = br.readLine();
pw.println(str);
pw.flush();
}catch(Exception e){
System.out.println("Error getclient.run():"+e.getMessage());
}
}
}
}
class getserver extends Thread{
private BufferedReader br = null;
private Socket socket = null;
public getserver(Socket socket){
this.socket = socket;
try{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public void run(){
while(true){
try{
String str = br.readLine().trim();
System.out.println("收到:"+str);
}catch(Exception e ){
System.out.println(e.getMessage());
}
}
}
}
Client:package example.socket.test;
import java.io.*;
import java.net.*;
import java.util.*;public class EchoClient {
public static void main(String[] args){
String addr = "127.0.0.1";
try{
Socket socket = new Socket(addr,8888);
System.out.println("socket="+socket);
new writerclient(socket).start();
new getclient(socket).start();
}catch(Exception e){
System.out.println(e.getMessage());
}finally{
//socket.close();
}
}
}class writerclient extends Thread{
private Socket socket = null;
private BufferedReader br = null;
private PrintWriter pw = null;
public writerclient(Socket socket){
this.socket = socket;
try{
br = new BufferedReader(new InputStreamReader(System.in));
pw = new PrintWriter(socket.getOutputStream());
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public void run(){
while(true){
try{
String str = br.readLine();
pw.println(str);
pw.flush();
}catch(Exception e){
System.out.println("Error getclient.run():"+e.getMessage());
}
}
}
}class getclient extends Thread {
private PrintWriter pw = null;
private Socket socket = null;
private BufferedReader br = null;
public getclient(Socket socket){
this.socket = socket;
try{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public void run(){
while(true){
String str = null;
try{
if((str = br.readLine().trim())!=null){
System.out.println("收到:"+str);
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
}
那个BufferedWriter,你是想用这个做缓冲流,
可以用数组啊,你这样byte[] buffer = new byte[10];,再送过去