java socket编程

来源:互联网 发布:手机真假检测软件 编辑:程序博客网 时间:2024/06/07 20:07
 1. 什么是socket 

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

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。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,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)


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




0 0
原创粉丝点击