黑马程序员-java基础之TCP传输客户端与服务端常用代码
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
一、TCP传输
客户端:
1、创建客户端Socket, 指定服务端地址和端口, 连接服务器. 本地地址和端口自动绑定.
Socket socket = new Socket("192.168.1.254", 9999);
2、获取客户端输入流, 可以读取服务端写出的数据
InputStream in = socket.getInputStream();
3、获取客户端输出流, 可以写出数据到服务端
OutputStream out = socket.getOutputStream();
4、客户端读取服务端写出的数据. 如果服务端还未写出, 阻塞等待
byte[] buffer = new byte[1024];
int len = in.read(buffer);
String msg = new String(buffer, 0, len);
System.out.println(msg);
5、客户端写出数据到服务端
out.write("我要报名JavaEE就业班!".getBytes());
6、释放资源
socket.close();
服务端:
1、 创建服务端ServerSocket, 绑定指定端口号
ServerSocket serverSocket = new ServerSocket(9999);
2、 阻塞, 服务端等待接收客户端请求
Socket socket = serverSocket.accept();
3、 获取服务端输入流, 可以读取客户端写出的数据
InputStream in = socket.getInputStream();
4、 获取服务端输出流, 可以写出数据到客户端
OutputStream out = socket.getOutputStream();
5、 服务端写出数据到客户端
out.write("欢迎拨打传智播客报名热线, 请问需要什么帮助?".getBytes());
6、 服务端读取客户端写出的数据. 如果客户端还未写出, 阻塞等待.
byte[] buffer = new byte[1024];
int len = in.read(buffer);
String msg = new String(buffer, 0, len);
System.out.println(msg);
7、释放资源
socket.close();
serverSocket.close();
其实,在客户端释放资源后,服务端也自然就释放资源了。
二、客户端与服务端改进
客户端:
Socket socket = new Socket("192.168.1.254", 9999);
BufferedReader keyBr = new BufferedReader(new InputStreamReader(System.in));
BufferedReader socketBr;
socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
// 从服务端读取一行, 打印
System.out.println(socketBr.readLine());
// 从键盘读取一行写出到服务端
ps.println(keyBr.readLine());
System.out.println(socketBr.readLine());
ps.println(keyBr.readLine());
socket.close();
服务端:
Socket socket = serverSocket.accept();
BufferedReader socketBr;
socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
String ip = socket.getInetAddress().getHostAddress();
int port = socket.getPort();
ps.println("欢迎拨打传智播客报名热线, 请问需要什么帮助?");
System.out.println(ip + ":" + port + " " + br.readLine());
socket.close();
三、多线程TCP传输
ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
final Socket socket = serverSocket.accept();
// 循环中每接收到一个客户端请求, 开启一条新线程
new Thread(){
public void run() {
try {
BufferedReader socketBr;
socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
String ip = socket.getInetAddress().getHostAddress();
int port = socket.getPort();
ps.println("欢迎拨打传智播客报名热线, 请问需要什么帮助?");
System.out.println(ip + ":" + port + " " + br.readLine());
ps.println("报满了, 等下一期吧!");
System.out.println(ip + ":" + port + " " + br.readLine());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
多线程TCP传输就是服务端能够回复多个客户端的请求服务,因此,可用多个线程来回应不同的客户端。
注意close()的作用范围,以免关掉了,再使用不起来了,尤其是在死循环中;如果在多个线程的TCP传输,服务端的Close()关闭流如果放在线程里边,那么一旦一个客户端响应完毕,服务端也相应结束,其它客户端则无法再请求到服务器的响应。但是,请求服务端获取到的客户端的Socket,可以在循环线程内在结束了访问关闭流。
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------