1、Socket是TCP网络通信中的概念。

    TCP是面向连接的可靠的字节流的传输

    TCP通信模型是典型的客户机-服务器模型

    TCP通信的双方使用所谓的Socket进行通信

2、Socket封装了通信一方的IP地址和端口号,是负责通信的组件。实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。

3、Java提供的Socket编程模型,主要涉及两个类:

Socket类和ServerSocket类

4、ServerSocket对象代表服务器方的监听者,等待和接受客户端发起的TCP连接,然后返回一个负责与该具体客户端通信的Socket对象。


服务端代码:

package com.fit.demo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) throws IOException {
		//在服务端创建ServerSocket对象,准备在6666端口监听
		ServerSocket server=new ServerSocket(6666);
		//监听到客户端的请求后,才执行后面的代码
		System.out.println("正在监听。。。");
		//监听客户端的请求,如果监听到客户端的请求,在服务端创建一个Socket对象与客户端通信
		Socket socket=server.accept();
		//获取输入流,读取网络中的数据
		InputStream ins=socket.getInputStream();
		DataInputStream dis=new DataInputStream(ins);
		String str=dis.readUTF();
		System.out.println(str);
		//获取输出流,向网络中写数据
		OutputStream os=socket.getOutputStream();
		DataOutputStream das=new DataOutputStream(os);
		das.writeUTF("你好,客户端!");
		
		//关闭资源
		das.flush();
		das.close();
		os.flush();
		os.close();
		
		dis.close();
		ins.close();
		socket.close();
		
	}
}


客户端代码:

package com.fit.demo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		//创建Socket对象,并向指定的服务端的6666端口发起连接
		Socket socket=new Socket("localhost", 6666);
		//获取输出流,向网络中写数据
		OutputStream os=socket.getOutputStream();
		DataOutputStream das=new DataOutputStream(os);
		das.writeUTF("你好,服务器端");
		
		das.flush();
		
		//获取输入流,读取网络中的数据(不能写在close()后面,因为服务已经关闭)
		InputStream ins=socket.getInputStream();
		DataInputStream dis=new DataInputStream(ins);
		String str=dis.readUTF();
		System.out.println(str);
		
		//关闭资源
		das.close();
		os.flush();
		os.close();
		dis.close();
		ins.close();
		socket.close();
	}
}

支持多客户端的client/server的程序:

       前面的Client/Server程序只能实现Server和一个客户的对话。在实际应用 中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上 面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求服务器就会启动一个专门的服务线程来响 应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态等待下一个客户的到来。