Java Socket初探

    网络上两个程序通过一个双向的通信连续实现数据的交换,这个双向链路的一端成为一个Socket。Socket也称套接字

    在Java语言中,Socket可以分为两种类型:

  1. TCP(传输控制协议):面向连接的Socket通信协议。
  2. UDP(用户数据报协议):面向无连接的Socket通信协议。

    任何一个Socket都是由IP地址端口号唯一确定的。

    基于TCP的通信过程简述:

  1. Server端监听指定某个端口(建议使用大于1024的端口)是否有连接请求。
  2. Client端向Server端发出Connect连接请求。
  3. Server端向Client端返回Accept接受消息。
  4. 会话建立。
  5. Server端和Client端可以通过Send、Write等方法与对方通信。

       举个栗子:用Socket实现客户端和服务端的通信,要求客户端发送数据后能够回显相同的数据。

       服务端:Server.java

package com.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			ServerSocket server = new ServerSocket(2000);
			Socket socket = server.accept();
			//获取输入流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//获取输出流
			pw = new PrintWriter(socket.getOutputStream(),true);
			//获取接收的数据
			String s = br.readLine();
			//发送相同的数据给客户端
			pw.println(s);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				br.close();
				pw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

        客户端:Client.java

package com.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			Socket socket = new Socket("localhost",2000);
			//获取输入流和输出流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			pw = new PrintWriter(socket.getOutputStream(),true);
			//向服务端发送数据
			pw.println("hello Socket");
			String s = null;
			while (true) {
				s= br.readLine();
				if (s != null) {
					break;
				}
			}
			System.out.println(s);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				br.close();
				pw.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

      先启动服务端程序,然后再运行客户端程序,客户端会把从服务端转发过来的数据打印出来。

      

        

猜你喜欢

转载自blog.csdn.net/Nerver_77/article/details/80771100