Java-Socket套接字

【Socket套接字】

java.net.Socket 套接字

  • 封装了TCP协议的通讯细节,使得我们使用它就可以以流的读写来完成与远端计算机的数据交换
  • 客户端:
  1. socket = new Socket(“localhost”,8080);
    实例化Socket的过程就是连接服务器端口的过程
    参数1:服务端地址的信息
    参数2:服务端开启的服务端口

    通过地址找到网络上的服务端的计算机,通过端口找到该机器上的服务端应用程序

  2. 返回此套接字的输出流

    OutputStream out = socket.getOutputStream();
    // 将此字符串发送到服务端(用高级流)
    OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
    BufferedWriter bw = new BufferedWriter(osw);
    PrintWriter pw = new PrintWriter(bw,true); // 自动行刷新
    pw.println("你好,服务端!");
    
  3. OutputStream out = socket.getOutputStream();
    Socket的该方法用来获取一个字节输出流,通过这个流写出的字节都会发送给远端计算机

  • 服务端:
  1. server = new ServerSocket(8088);
    运行在服务端的ServerSocket主要有两个作用:

    1. 向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的

    2. 监听服务端口,一旦客户端通过该端口尝试建立连接时,会立即返回一个Socket实例,通过这个Socket实例即可以与客户端交互

      实例化ServerSocket的同时向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的
      如果该端口已经被其他程序占用,此时实例化会抛出异常java.net.SocketException:address already in user…

  2. Socket socket = server.accept();
    阻塞等待客户端连接
    该方法是一个阻塞方法,调用后开始等待客户端的连接。
    一旦一个客户端通过服务端开启的端口建立连接,此时accept方法会立即返回一个Socket实例,通过该实例即可与该客户端进行交互
    多次调用该方法可以接受多个客户端的连接

  3. 返回此套接字的输入流

    InputStream in = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(in,"UTF-8");
    BufferedReader br = new BufferedReader(isr);
    String message = br.readLine();
    System.out.println("客户端说:"+message);
    
  4. String message = br.readLine();
    这里使用br.readLine读取客户端发送过来的一行字符串,客户端断开连接时,不同系统会导致这里的反映不同:
    windows的客户端断开时通常这里抛出异常
    linux的客户端断开时这里会返回null

  &bsp;

【简单客户端,服务端】

客户端示例:

package socket;

import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

/** 聊天室客户端 */
public class Client {
	private Socket socket;

	/** 构造方法(初始化客户端) */
	public Client() {
		try {
			System.out.println("正在启动客户端...");
			socket = new Socket("localhost",8080);
			// socket = new Socket("176.35.5.62",8080);
			System.out.println("客户端启动完毕!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/** 客户端开始工作的方法 */
	public void start() {
		try {
			// 返回此套接字的输出流
			OutputStream out = socket.getOutputStream();
			// 将此字符串发送到服务端(用高级流)
			OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
			BufferedWriter bw = new BufferedWriter(osw);
			PrintWriter pw = new PrintWriter(bw,true); // 自动行刷新
			// pw.println("你好,服务端!");
			Scanner scan = new Scanner(System.in);
			System.out.println("请输入你要发送给服务端的话:");
			while(true) {
				String sendInfo = scan.nextLine();
				if("exit".equals(sendInfo)) {
					break;
				}
				pw.println(sendInfo);
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Client client = new Client();
		client.start();
	}
}

服务端示例:

package socket;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/** 聊天室服务端 */
public class Server {
	private ServerSocket server;

	/** 构造方法 */
	public Server() {
		try {
			System.out.println("正在启动服务端...");
			server = new ServerSocket(8080);
			System.out.println("服务端启动完毕!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/** 服务端开始工作的方法 */
	public void start() {
		try {
			System.out.println("等待客户端连接...");
			Socket socket = server.accept();
			System.out.println("一个客户端连接了!");
		
			// 返回此套接字的输入流
			InputStream in = socket.getInputStream();
			InputStreamReader isr = new InputStreamReader(in,"UTF-8");
			BufferedReader br = new BufferedReader(isr);
		
			// String message = br.readLine();
			// System.out.println("客户端说:"+message);
			String message = null;
			while((message = br.readLine()) != null) {
				System.out.println("客户端说:"+message);
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Server server = new Server();
		server.start();
	}
}

你可能感兴趣的:(Java,java,socket)