zoukankan      html  css  js  c++  java
  • [JavaWeb基础] 024.Socket编程之简单的聊天程序

    1.Socket的简介

    1)什么是Socket

    网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个SocketSocket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址一个端口号唯一确定。

    但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程

    2)Socket通讯的过程

    Server端Listen(监听)某个端口是否有连接请求Client端向Server 端发出Connect(连接)请求Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

    对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤

      (1) 创建Socket;

      (2) 打开连接到Socket的输入/出流;

      (3) 按照一定的协议对Socket进行读/写操作;

      (4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)

    2.Socket的Server端代码

    package com.babybus.sdteam.server;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TalkServer {
    	public static void main(String args[]) {
    		try{
    			ServerSocket server=null;
    			try{
    				// 创建一个ServerSocket在端口4700监听客户请求
    				server=new ServerSocket(4700);
    			}catch(Exception e) {
    				// 出错,打印出错信息
    				System.out.println("can not listen to:"+e);
    			}
    			Socket socket=null;
    			try{
    				// 使用accept()阻塞等待客户请求,有客户
    				// 请求到来则产生一个Socket对象,并继续执行
    				socket=server.accept();
    			}catch(Exception e) {
    				System.out.println("Error."+e);
    				//出错,打印出错信息
    			}
    			String line;
    			// 由Socket对象得到输入流,并构造相应的BufferedReader对象
    			BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			// 由Socket对象得到输出流,并构造PrintWriter对象
    			PrintWriter os = new PrintWriter(socket.getOutputStream());
    			// 由系统标准输入设备构造BufferedReader对象
    			BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
    			// 在标准输出上打印从客户端读入的字符串
    			System.out.println("Client:"+is.readLine());
    			// 从标准输入读入一字符串 如果该字符串为 "bye",则停止循环
    			line=sin.readLine();
    			while(!line.equals("bye")){
    				// 向客户端输出该字符串
    				os.println(line);
    				// 刷新输出流,使Client马上收到该字符串
    				os.flush();
    				// 在系统标准输出上打印读入的字符串
    				System.out.println("Server:"+line);
    				// 从Client读入一字符串,并打印到标准输出上
    				System.out.println("Client:"+is.readLine());
    				line=sin.readLine();
    			} 
    			// 关闭Socket输出流
    			os.close(); 
    			// 关闭Socket输入流
    			is.close(); 
    			// 关闭Socket
    			socket.close(); 
    			// 关闭ServerSocket
    			server.close(); 
    		}catch(Exception e){
    			System.out.println("Error:"+e);
    		}
    	}
    }
    

     3.Socket的Client端代码

    package com.babybus.sdteam.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 TalkClient {
       public static void main(String[] args) {
    	 try {
    		// 新建一个socket
    		Socket socket = new Socket("127.0.0.1", 4700);
            // 向本机的4700端口发出客户请求
            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
            // 由系统标准输入设备构造BufferedReader对象
            PrintWriter os=new PrintWriter(socket.getOutputStream());
            // 由Socket对象得到输出流,并构造PrintWriter对象
            BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 由Socket对象得到输入流,并构造相应的BufferedReader对象
            String readline;
            // 从系统标准输入读入一字符串
            readline=sin.readLine(); 
            while(!readline.equals("bye")){
            	// 若从标准输入读入的字符串为 "bye"则停止循环
            	os.println(readline);
            	// 将从系统标准输入读入的字符串输出到Server
            	os.flush();
            	// 刷新输出流,使Server马上收到该字符串
            	System.out.println("Client:"+readline);
            	// 在系统标准输出上打印读入的字符串
            	System.out.println("Server:"+is.readLine());
            	// 从Server读入一字符串,并打印到标准输出上
            	readline=sin.readLine(); //从系统标准输入读入一字符串
            }
            os.close(); //关闭Socket输出流
            is.close(); //关闭Socket输入流
            socket.close(); //关闭Socket
    	} catch (UnknownHostException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
       }
    }
    

     4.上面已经写得很详细了,有兴趣的创建个Java程序运行下就明白了。

     

    本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 

    转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4890437.html

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/superdo/p/4890437.html
Copyright © 2011-2022 走看看