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
		}
		
	}
}

 

上面是简单的套接字使用的程序,如果有问题请指出,谢谢  

 

posted @ 2019-02-14 16:33  Bug研发工程师  阅读(437)  评论(0编辑  收藏  举报