【Java】Socket入门 [二]

Socket通信:

TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据。

基于TCP协议实现网络通信的类:

客户端的socket

服务器端的ServerSocket

 

【Java】Socket入门 [二]_第1张图片


一、Socket通信实现步骤:

1、创建ServerSocketSocket

2、打开连接到Socket的输入/输出流

3、按照协议对Socket进行读/写操作

4、关闭输入输出流、关闭Socket

建立:

服务器端:

1、创建ServerSocket对象,绑定监听端口

2、通过accept()方法监听客户端需求

3、建立连接后,通过输入流读取客户端发送的信息

4、通过输出流响应客户端

5、关闭相应资源


/**
 * 基于TCP协议的Socket通信
 * 客户端
 * @author dell2014
 */
public class Server {

	public static void main(String[] args){
		try {
			//1.创建一个服务器端的ServerSocket,指定绑定的端口,并监听此端口
			ServerSocket serverSocket = new ServerSocket(8888);
			//2.调用accept()方法监听,等待客户端连接
			System.out.println("***服务器即将启动,等待客户端连接***");
			Socket socket = serverSocket.accept();
			//3.获取输入流,用来读取客户端发送的信息
			InputStream is = socket.getInputStream();//字节输入流
			InputStreamReader isr = new InputStreamReader(is);//转化为字符流
			BufferedReader br = new BufferedReader(isr);
			String info = null;
			while( (info = br.readLine()) != null){//循环读取信息
				System.out.println("这是服务器,客户端说:"+info); 
			}
			socket.shutdownInput();//关闭输入流
			//4.获取输出流,响应客户端请求
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);//包装为打印流
			pw.write("welcome!");
			pw.flush();//刷新缓存,输出
			
			//5.关闭资源
			pw.close();
			os.close();
			br.close();
			isr.close();
			is.close();
			socket.close();
			serverSocket.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


客户端:

1、创建Socket对象,指明需要连接的服务器的地址和端口号

2、连接建立后,通过输出流向服务器端发送请求信息

3、通过输入流获取服务器响应的信息

4、关闭相应资源


/**
 * 基于TCP协议的Socket通信
 * 客户端
 * @author dell2014
 */
public class Client {
	public static void main(String[] arg){
		try {
			//1.创建客户端Socket,指定服务器地址和端口
			Socket socket = new Socket("localhost",8888);
			//2.获取输出流,向服务器发送信息
			OutputStream os = socket.getOutputStream();//字节输出流
			PrintWriter pw = new PrintWriter(os);//将输出流打包为打印流
			pw.write("用户名:admin;密码:123");
			pw.flush();//刷新缓存,向服务器发送信息
			socket.shutdownOutput();//关闭输出流
			
			//3.获取输入流,并读取服务器端响应信息
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String info = null;
			while( (info = br.readLine()) != null){//循环读取信息
				System.out.println("这是客户端,服务器端说:"+info); 
			}
			//4.关闭资源
			br.close();
			is.close();
			pw.close();
			os.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果:

服务器端:

***服务器即将启动,等待客户端连接***
这是服务器,客户端说:用户名:admin;密码:123

客户端:

这是客户端,服务器端说:welcome!



二、多线程服务器

应用多线程来实现服务器与客户端的通信

基本步骤

1、服务器端创建ServerSocket,循环调用accept() 等待客户端连接

2、客户端创建一个Socket并请求和服务器端连接

3、服务器接受客户端请求,创建socket与该客户端建立专线连接

4、建立连接的两个socket在一个单独的线程上对话

5、服务器继续等待新的连接


/**
 * 服务器端线程处理类
 * @author dell2014
 *
 */

public class ServerThread extends Thread {
	//和本线程相关的socket
	Socket socket=null;
	public ServerThread(Socket socket){
		this.socket = socket;
	}
	
	//线程执行操作,响应客户端请求(重写run方法)
	
	@SuppressWarnings("null")
	public void run(){
		InputStream is = null;
		BufferedReader br = null;
		OutputStream os = null;
		PrintWriter pw = null;
		try {
			is = socket.getInputStream();
			br = new BufferedReader(new InputStreamReader(is));
			String info = null;
			while( (info = br.readLine()) != null){
				System.out.println("这是服务器,客户端说:"+info); 
			}
			socket.shutdownInput();
			os = socket.getOutputStream();
			pw = new PrintWriter(os);
			pw.write("welcome!");
			pw.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{//最终一定执行代码,关闭资源
				try {
					if(pw != null)
						pw.close();
					if(os != null)
					os.close();
					if(br != null)
						br.close();
					if(pw != null)
						is.close();
					if(pw != null)
						socket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}
}


/**
 * 基于TCP协议的Socket通信
 * 客户端
 * @author dell2014
 */
public class Server {

	public static void main(String[] args){
		try {
			ServerSocket serverSocket = new ServerSocket(8888);
			Socket socket = null;
			int count = 0;//记录连接数量
			System.out.println("***服务器即将启动,等待客户端连接***");
			//循环监听等待客户端连接
			while(true){
				socket = serverSocket.accept();
				//创建一个新线程
				ServerThread serverThread = new ServerThread(socket);
				//启动线程
				serverThread.start();
				//统计客户端数量并输出
				count++;
				System.out.println("客户端连接数量:"+count);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


你可能感兴趣的:(【Java】Socket入门 [二])