Java_基础—网络编程(TCP协议代码及其优化和服务器多线程优化)
2017-09-06 10:58
706 查看
TCP: 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
1、客户端
创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
2、服务端
创建ServerSocket(需要指定端口号)
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
Demo1_Client.java
Demo1_Server.java
将字节流包装成字符流的优化
注意:readLine()方法是以”/r/n”为判断结束标记的
Demo2_Client.java
Demo2_Server.java
优化服务器,将服务器改为多线程的
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
1、客户端
创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
2、服务端
创建ServerSocket(需要指定端口号)
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
Demo1_Client.java
package com.soar.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Demo1_Client { /* 1.客户端 * 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器 * 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流 * 输入流可以读取服务端输出流写出的数据 * 输出流可以写出数据到服务端的输入流 */ public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("127.0.0.1", 12345); InputStream is = socket.getInputStream(); //获取客户端输入流 OutputStream os = socket.getOutputStream(); //获取客户端输出流 byte[] arr = new byte[1024]; int len = is.read(arr); //读取服务器发过来的数据 System.out.println(new String(arr,0,len)); //将数据转换为字符串并打印 os.write("学习使我快乐".getBytes()); //客户端向服务器写数据 socket.close(); //关掉客户端 } }
Demo1_Server.java
package com.soar.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Demo1_Server { /* 2.服务端 * 创建ServerSocket(需要指定端口号) * 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket * 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流 * 输入流可以读取客户端输出流写出的数据 * 输出流可以写出数据到客户端的输入流 */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(12345); Socket socket = server.accept(); //接受客户端的请求 InputStream is = socket.getInputStream(); //获取客户端输入流 OutputStream os = socket.getOutputStream(); //获取客户端输出流 os.write("百度一下".getBytes()); //服务器向客户端写出数据 byte[] arr = new byte[1024]; int len = is.read(arr); //读取客户端发过来的数据 System.out.println(new String(arr,0,len)); //将数据转换为字符串并打印 socket.close(); //server.close(); //服务器一般不会关 } }
将字节流包装成字符流的优化
注意:readLine()方法是以”/r/n”为判断结束标记的
Demo2_Client.java
package com.soar.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; public class Demo2_Client { /* 4000 1.客户端 */ public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("127.0.0.1", 12345); //将字节流包装成了字符流 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //PrintStream中有写出换行的方法 PrintStream ps = new PrintStream(socket.getOutputStream()); System.out.println(br.readLine()); ps.println("你好,我是Soar_Sir的粉丝"); System.out.println(br.readLine()); ps.println("我超喜欢你"); socket.close(); //关掉客户端 } }
Demo2_Server.java
package com.soar.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Demo2_Server { /* 2.服务端 */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(12345); Socket socket = server.accept(); //接受客户端的请求 //将字节流包装成了字符流 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //PrintStream中有写出换行的方法 PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println("欢迎咨询Soar_Sir"); System.out.println(br.readLine()); //readLine()方法是以"/r/n"为判断结束标记的 ps.println("谢谢"); System.out.println(br.readLine()); socket.close(); //server.close(); //服务器一般不会关 } }
优化服务器,将服务器改为多线程的
package com.soar.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Demo3_Server3 { /* 2.服务端 */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(12345); while(true){ //匿名内部类的变量需要用final来修饰 final Socket socket = server.accept(); //接受客户端的请求 new Thread(){ public void run(){ try { //将字节流包装成了字符流 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //PrintStream中有写出换行的方法 PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println("欢迎咨询Soar_Sir"); System.out.println(br.readLine()); //readLine()方法是以"/r/n"为判断结束标记的 ps.println("谢谢"); System.out.println(br.readLine()); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } }
相关文章推荐
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)
- 【Java】基于TCP协议多线程服务器-客户端交互控制台聊天室简例
- 《黑马程序员》java笔记->生产消费多线程,同步代码块(优化代码)
- C++网络编程基础代码(服务器)---基于TCP协议
- JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天
- Java_基础—流的标准处理异常代码1.6版本及其以前
- java-socket多线程网络编程案列--搭建本地简易聊天对话服务器
- 黑马程序员 java 基础 毕向东 面向对象 多线程 通信 优化 jdk 1.5 之后新特性Lock
- JAVA 基础代码性能优化
- Java基础多线程间通讯同步操作示例一(未优化):
- JAVA代码—算法基础:寻找完美的数(算法优化详解)
- Java基础学习总结(99)——Java代码性能优化总结
- java中的反射机制基础概念及其代码演示
- java多线程-线程间通信_代码优化
- JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天
- java基础之多线程复制文件代码演示
- java多线程基础知识:如何编写线程安全代码
- Java基础多线程间通讯示例操作(已优化)二:
- java-基础-hashcode()及其优化
- 黑马程序员——Java基础---面向对象及其一些代码内部结构分析