java网络编程之套接字TCP
套接字学习
- 什么是套接字?
- 计算机网络基础知识
- 基于套接字的网路编程案例?
什么是套接字?
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程
序通常通过"套接字"向网络发出请求或者应答网络请求。
套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的
套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套
接字有两种不同的类型:流套接字和数据报套接字。
计算机网络基础知识
什么是技术机网络:
通过有线/无线的链路连接多个计算机设备
进行数据通信或设备共享
标识:
物理: MAC 芯片(网卡/网络适配器/蓝牙/WIFI)
逻辑:IP地址
IP v4 2^32
IP v6 2^128
端口号:port
2^16 0~65535 65536
1024(已占用的端口数目)
http,ftp,ssh,pop,smtp,默认占用了端口(eg:80web端口)
网络通信中标识的网络服务
TCP/IP
应用层 HTTP/HTTPS/pop3/SMTP/SSH/FTP/自定义
传输层 TCP/UDP (套接字)
TCP 传输控制协议
UDP 用户数据报协议
网络层 IP协议
物理层/数据链路层
注意:
后面的博客将会写出TCP/IP学习分享
基于套接字的网路编程案例?
使用线程池实现客户端与服务器的通信,客户端给服务器发送一个字符串,服务器做反转后再发送给客户端.(下面给出一个简单的例子)
客户端程序:
package cn.csuft.poorguy.fileserver; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 * * @author Bug研发工程师 * */ public class Client { // 服务器端口 int port = 9000; // 服务器地址 InetAddress address; // 客户端TCP套接字 Socket socket; public Client() { try { address = InetAddress.getByName("127.0.0.1"); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { socket = new Socket(address, port); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void start() { // 先发送 // 再接受字符传反转或变成大写再发送回来 // 服务端实现反转再发回去 // 服务器将小写 try (OutputStream out = socket.getOutputStream()) { String s = "hello"; out.write(s.getBytes()); out.flush(); InputStream in = socket.getInputStream(); byte[] buf = new byte[128]; int size = in.read(buf); // String now = new String(buf, 0, size); // System.out.println("当前时间: " + now); String s_reverse = new String(buf, 0, size); System.out.println("转置的结果是: " + s_reverse); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { Client client = new Client(); Client client1 = new Client(); Client client2 = new Client(); client.start(); client1.start(); client2.start(); } }
服务器端程序:
package cn.csuft.poorguy.fileserver; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 文件服务器(Server) * 软件:提供服务(对(客户端)请求提供相应)的程序 * @author Bug研发工程师 * */ public class FileServer { //地址 //IP InetAddress address; //Port 端口 int port = 9000; //套接字 //Socket socket ServerSocket serverSocket; ExecutorService pool; public FileServer() { try { address = InetAddress.getByName("127.0.0.1"); // for(InetAddress ads : InetAddress.getAllByName("www.baidu.com")) { // System.out.println(ads.getHostAddress()); // } } catch (UnknownHostException e) { e.printStackTrace(); } //创建服务端套接字 //在当前主机 try { serverSocket = new ServerSocket(port); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { FileServer server = new FileServer(); server.start(); } public void start() { pool = Executors.newCachedThreadPool(); //接受客户端的请求 System.out.println("服务器启动..."); while(true) { try { Socket s = serverSocket.accept(); pool.execute(new TimeService(s)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
多线程程序:
package cn.csuft.poorguy.fileserver; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Date; public class TimeService implements Runnable{ Socket socket; public TimeService() { } public TimeService(Socket socket) { this.socket = socket; } /** * 字符串转置 * @param s * @return */ private String reverse(String s) { char []arr = s.toCharArray(); int limit = arr.length-1; int middle = arr.length>>1; for(int i=0;i<middle;i++) { char temp = arr[i]; arr[i] = arr[limit-i]; arr[limit-i] = temp; } System.out.println(new String(arr)); return new String(arr); } @Override public void run() { String now = new Date().toLocaleString(); System.out.println(Thread.currentThread().getName()+"处理"+socket.getPort()); try (OutputStream out = socket.getOutputStream()){ InputStream in = socket.getInputStream(); byte []buf = new byte[1024]; int size = in.read(buf); String s = new String(buf,0,size); s = reverse(s); out.write(s.getBytes()); out.flush(); //out.close(); } catch (Exception e) { // TODO: handle exception } } }
上面是简单的套接字使用的程序,如果有问题请指出,谢谢