Socket通信
  1、TCP协议是面相连接、可靠地、有序的,以字节流的方式发送数据
  2、基于TCP协议实现网络通信的类:客户端的Socket类,服务器端的ServerSocket类


Socket通信实现步骤
  1、创建ServerSocket和Socket
  2、打开连接到Socket的输入/输出流
  3、按照协议对Socket进行读/写操作
  4、关闭输入输出流、关闭Socket

ServerSocket常用的方法 

   1、常用构造方法:ServerSocket(int port)//创建绑定到特点端口的服务器套接字 

   2、Socket accept()//侦听并接受到此套接字的连接,调用会阻塞该端口并等待连接 

   3、close()//关闭此套接字 

   4、InetAddress getInetAddress()//返回次服务器套接字的本地地址 

   5、int getLocalPort()//返回该套接字的端口号 

    

 Socket常用的方法 

   1、构造方法:Socket(InetAddress address,int port)//指定IP和端口号创建Socket 

               Socket(String host,int port)//指定主机上的指定端口号创建Socket 

   2、close():关闭此套接字 

   3、InetAddress getInetAddress()//返回套接字连接的地址 

   4、InputStream getInputStream()//返回此套接字的输入流 

      shutdownInput()//关闭输入流 

      OutputStream getOutputStream()//返回此套接字的输出流 
     shutdownOutput()//关闭输出流

服务器端:
 1.创建ServerSocket对象,绑定监听端口
 2.accept()方法监听客户端请求
 3.建立连接后,通过输入流读取客户端发送信息
 4.通过输出流向客户端发送响应信息
 5.关闭相关资源

 客户端:
 1.创建Socket对象,指明需要连接的服务器的地址和端口号
 2.连接建立后,通过输出流 服务器端发送请求信息
 3.通过输入流获取服务器响应的信息
 4.关闭相关资源
服务器端:
 //1.创建一个serverSocket,绑定监听端口
 ServerSocket serverSocket = new ServerSocket(8888);
 //2.调accept()方法开始监听,等待客户端连接
 System.out.println("***服务器即将启动,等待连接***");
 Socket socket = serverSocket.accept();
 //3.获取输入流,用来读取客户端发送的信息
 InputStream is=socket.getInputStream();//字节输入流
 InputStreamReader ir = new InputStreamReader(is);//将字节流转为字符流
 BufferedReader br = new BufferedReader(ir);//为输入流添加缓冲
 String data = br.readLine();
 while(data!=null){
 System.out.println("我是服务器,客户端说:" + data);
 data = br.readLine();
 }
 socket.shutdownInput(); //注意:关闭输入流,否则会造成阻塞。
 //创建输出流,响应客户端请求
 OutputStream out=socket.getOutputStream();
 //将输出流转为打印流
 PrintWriter pw=new PrintWriter(out);
 pw.write("欢迎您~~~");
 pw.flush();//调用flush()方法将缓冲输出
 socket.shutdownOutput();//关闭socket输出流
 //关闭资源
 br.close();
 ir.close();
 is.close();
 socket.close();
 serverSocket.close();
 客户端: 

 //1.创建客户端Socket,指定服务器地址和端口 

 Socket socket=new Socket("localhost", 8888); 

 //2.获取输出流,向服务器端发送信息 

 OutputStream os=socket.getOutputStream();//字节输出流 

 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 

 pw.write("用户名:alice;密码:789"); 

 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); 

 } 

 socket.shutdownInput();//注意:关闭输入流 

 //4.关闭资源 

 br.close(); 

 is.close(); 

 pw.close(); 

 os.close(); 

 socket.close(); 

Ps1:小技巧:点击蓝色电脑可以切换不同类的控制台。


 Ps2:服务端要优先于客户端启动,等待命令的传输。
多线程服务器:
 应用多线程来实现服务器与多客户端之间的通信
 基本步骤:
 1、服务器端创建ServerSocket,循环调用accept()等待客户端连接
 2、客户端创建一个socket并请求和服务器端连接
 3、服务器端接受客户端的请求,创建socket与客户端建立专线连接
 4、建立连接的两个socket在一个单独的线程上对话
 5、服务器端继续等待新的连接

 ServerSocket常用方法:
 ServerSocket(int port)——创建并绑定到特定端口的服务器套接字
 accept()——侦听并接受到此套接字的连接
 close()——关闭此套接字
 getInetAddress()——得到ServerSocket对象绑定的IP地址。如果ServerSocket对象未绑定IP地址,返回0.0.0.0。
 getLocalPort()——返回此套接字在其上侦听的端口

 Socket常用方法:
 Socket(InetAddress address, int port)——创建一个套接字并将其连接到指定ip地址的指定端口号
 Socket(String host, int port)——创建一个套接字并将其连接到指定主机上的指定端口号
 close()——关闭此套接字
 getInetAddress()——返回套接字连接的地址
 getInputStream()——返回此套接字的输入流
 getOutputStream——返回此套接字的输出流服务器线程处理类:
 public class ServerThread extends Thread {
// 和本线程相关的Socket
Socket socket = null;


public ServerThread(Socket socket) {
this.socket = socket;
}

//线程执行的操作,响应客户端的请求
public void run(){
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
try {
//获取输入流,并读取客户端信息
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取客户端的信息
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();//调用flush()方法将缓冲输出
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭资源
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
 }
服务器端:
 //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null;
//记录客户端的数量
int count=0;
System.out.println("***服务器即将启动,等待客户端的连接***");
//循环监听等待客户端的连接
while(true){
//调用accept()方法开始监听,等待客户端的连接
socket=serverSocket.accept();
//创建一个新的线程
ServerThread serverThread=new ServerThread(socket);
//启动线程
serverThread.start();

count++;//统计客户端的数量
System.out.println("客户端的数量:"+count);
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());