需求:客户端与服务端一问一答聊天。
注意:
1.如果使用BufferedReader的readLine()方法本身不读取“\r\n”,但是判断一行读取完成的标准是"\r\n",所以在使用write()写出数据的时候,要加上“\r\n”,不然readLine()永远无法完成读取。
2.使用字符流一定要调用flush()方法数据才会写出。
2.使用字符流一定要调用flush()方法数据才会写出。
客户端
package com.cn.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年8月6日19:05:47
* Desc:
需求:客户端与服务端一问一答聊天。
注意:
1.如果使用BufferedReader的readLine()方法一定要加上"\r\n"才能把数据写出。
2.使用字符流一定要调用flush()方法数据才会写出。
*/
/**
* 聊天的客户端
* @author zhiyong
*
*/
public class ChatClient {
public static void main(String[] args) throws IOException {
//建立tcp的客户端服务
Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
//获取socket的输出流对象
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter socketOut = new OutputStreamWriter(outputStream);
//获取socket的输入流对象
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取键盘的输入流对象,读取数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//不断的读取键盘录入的数据,然后把数据写出
String line = null;
System.out.println("请输入发送给服务端的数据:");
while((line = bufferedReader.readLine()) != null){//readLine()读取的line中不包括\r\n
socketOut.write(line + "\r\n");
socketOut.flush();//刷新
//读取服务端会送的数据
String readLine = socketReader.readLine();
System.out.println("服务端回送的数据:");
System.out.println(new String(readLine.getBytes(), "gbk"));
}
//关闭资源
socket.close();
}
}
服务端
package com.cn.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 聊天的服务端
* @author zhiyong
*
*/
public class ChatServer {
public static void main(String[] args) throws IOException {
//建立tcp的服务端
ServerSocket serverSocket = new ServerSocket(9090);
//接受客户端的连接,产生一个Socket
Socket socket = serverSocket.accept();
//获取到Socket的输入流对象
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取Socket的输出流对象
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//获取键盘的输入流对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//读取客户端的数据
String line = null;
while((line = socketReader.readLine()) != null){//在客户端发送过来的字符串中要加上“\r\n”因为readLine()本身是不读取“\r\n”,这里判断一行的标准就是字符串中有"\r\n"
System.out.println("服务端接收到的数据:");
System.out.println(new String(line.getBytes(), "utf-8"));
System.out.println("请输入回复给客户端的数据:");
line = bufferedReader.readLine();
socketWriter.write(line + "\r\n");
socketWriter.flush();//必须刷新
}
//关闭资源
serverSocket.close();
}
}