W e S D
0 1

[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

posted @ 2015-10-18 22:00  SD.Team  阅读(784)  评论(0编辑  收藏  举报