java socket编程

6 篇文章 0 订阅
 1. 什么是socket 

   所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接 。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TC P/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,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)


3.简单的Client/Server程序

client

public class ClientSocket {

	public void go() throws UnknownHostException, IOException{
		/**注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,
		 * 只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,
		 * 例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 
		 * 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
		 */
		//向服务器端发送请求,服务器IP地址和服务器监听的端口号 
		Socket client = new Socket("127.0.0.1", 4242);
		
		//通过printWriter 来向服务器发送消息,client.getOutputStream()从socket获得输出流
		PrintWriter print = new PrintWriter(client.getOutputStream());
		System.out.println("连接已建立...");
		
		//发送消息  
		print.println("hello Server 这是测试");
		
		print.flush();
		
		//InputStreamReader是低层和高层串流之间的桥梁  
        //client.getInputStream()从Socket取得输入串流
		InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
		
		//链接数据串流,建立BufferedReader来读取,将BufferReader链接到InputStreamReder  
		BufferedReader reader = new BufferedReader(streamReader);
		
		String advice = reader.readLine();
		
		System.out.println("接收到服务器的消息:"+advice);
		
		reader.close();
		client.close();
	}
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		ClientSocket client = new ClientSocket();
		client.go();
	}
}

server端

public class SocketServer {
	
	private ServerSocket ss;
	
	private InputStreamReader streamReader;
	
	private BufferedReader reader;
	
	public void server() throws IOException{
		//让服务器端程序开始监听来自4242端口的客户端请求 
		if(ss==null){
			ss = new ServerSocket(4242);
			System.out.println("服务器启动...");
		}
		
		//服务器无穷的循环等待客户端的请求 
		while(true){
			/** 
             *accept()方法会在等待用户的socket连接时闲置着,当用户链接 
             *上来时,此方法会返回一个socket(在不同的端口上)以便与客户端 
             *通信。Socket与ServerSocket的端口不同,因此ServerSocket可以 
             *空闲出来等待其他客户端 
             */  
			//这个方法会停下来等待要求到达之后再继续
			Socket client = ss.accept();
			
			//获取socket的输入流,来读取客户端输入的内容
			streamReader = new InputStreamReader(client.getInputStream());
			
			reader = new BufferedReader(streamReader);
			
			String advice = reader.readLine();
			
			System.out.println("接收到了客户端的请求:"+advice);
			
			//使用printWriter来向客户端反馈内容
			PrintWriter out = new PrintWriter(client.getOutputStream());
			
			out.println("I am Server");
			
			out.close();
		}
		
	}

	public static void main(String[] args) throws IOException {
		SocketServer ss = new SocketServer();
		ss.server();
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值