Java的原生Socket(java.net.Socket)通信的举例:

首先是创建Socket的服务端;其次创建Socket的客户端。

通信过程如下:

客户端(C)向服务端(S)发送任意数据,服务端接受到来自客户端的数据并展示,同时激发服务端向客户端不停的发送随机数据;客户端接受来自服务端的数据并展示。

说明:通信过程如上。下面看代码如何实现:

服务端:

/**
 * XXXX软件有限公司

 * socket:socket.Server.java
 * 日期:2015年12月4日
 */
package socket;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 * Socket通信的服务端 

 * 
 * @author 王俊伟 
 * @date 2015年12月4日 上午10:01:11
 */
public class Server {

	public static final int PORT = 4444;// 监听的端口号 9666 4444

	public static void main(String[] args) {
		Server server = new Server();
		server.init();
	}

	private void init() {
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(PORT);
			//System.out.println(serverSocket.getInetAddress());
			while (true) {
				Socket client = serverSocket.accept();
				// 一个客户端连接就开户两个线程处理读写
				new Thread(new ReadHandlerThread(client)).start();
				new Thread(new WriteHandlerThread(client)).start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (serverSocket != null) {
					serverSocket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

/**
 * 
 * 读客户端数据 

 * 
 * @author 王俊伟
 * @date 2016年7月21日 下午5:13:49
 */
class ReadHandlerThread implements Runnable {
	private Socket client;

	public ReadHandlerThread(Socket client) {
		this.client = client;
	}

	@Override
	public void run() {
		BufferedReader br = null;
		try {
			while (true) {
				// 读取客户端数据
				br = new BufferedReader(new InputStreamReader(client.getInputStream()));
				String reciver = br.readLine();
				System.out.println("客户端发过来的内容:" + reciver);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (client != null) {
					client = null;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

/**
 * 处理写操作的线程
 */
class WriteHandlerThread implements Runnable {
	private Socket client;

	public WriteHandlerThread(Socket client) {
		this.client = client;
	}

	@Override
	public void run() {
		DataOutputStream dos = null;
		BufferedReader br = null;
		try {
			while (true) {
				// 向客户端回复信息
				dos = new DataOutputStream(client.getOutputStream());
				//System.out.print("请输入:\t");
				// 键盘录入
				//br = new BufferedReader(new InputStreamReader(System.in));
				String data = "TTLK" + new Random().nextInt(100);
				System.out.println("发给客户端数据:"+data);
				StringReader in = new StringReader(data);
				br = new BufferedReader(in);
				String send = br.readLine();
				// 发送数据
				dos.writeBytes(send+"\n");	//必须写入换行符
				Thread.sleep(3000);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (dos != null) {
					dos.close();
				}
				if (br != null) {
					br.close();
				}
				if (client != null) {
					client = null;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

客户端:

/**
 * XXXX软件有限公司

 * socket:socket.Client.java
 * 日期:2015年12月4日
 */
package socket;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * Socket通信的客户端 

 * 
 * @author 王俊伟
 * @date 2015年12月4日 下午1:04:42
 */
public class Client {
	public static final String IP = "127.0.0.1";//服务器地址	127.0.0.1	192.168.100.5	10.50.200.120
    public static final int PORT = 4444;//服务器端口号  4444 		9666
    
    public static void main(String[] args) {    
        handler();   
    } 
    private static void handler(){  
        try {  
            //实例化一个Socket,并指定服务器地址和端口  
            Socket client = new Socket(IP, PORT);  
            //开启两个线程,一个负责读,一个负责写  
            new Thread(new CReadHandlerThread(client)).start();  
            new Thread(new CWriteHandlerThread(client)).start();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}
/** 
 *处理读服务器操作的线程   
 */  
class CReadHandlerThread implements Runnable{  
    private Socket client;  
  
    public CReadHandlerThread(Socket client) {  
        this.client = client;  
    }  
  
    @Override  
    public void run() {  
        BufferedReader br = null;
        try {  
            while(true){  
                //读取服务器端数据    
            	br = new BufferedReader(new InputStreamReader(client.getInputStream()));
                String receive = br.readLine();//读入一行
                System.out.println("服务器端返回数据:\t" + receive);    
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally{  
            try {  
                if(br != null){  
                	br.close();  
                }  
                if(client != null){  
                    client = null;  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  
  
/** 
 * 处理写操作的线程  
 */  
class CWriteHandlerThread implements Runnable{  
    private Socket client;  
  
    public CWriteHandlerThread(Socket client) {  
        this.client = client;  
    }
  
    @Override  
    public void run() {  
        DataOutputStream dos = null;  
        BufferedReader br = null;  
        try {  
//            while(true){  
//                //取得输出流  
//                dos = new DataOutputStream(client.getOutputStream());  
//                System.out.print("请输入: \t\n");    
//                //键盘录入  
//                br = new BufferedReader(new InputStreamReader(System.in)); 
//                String send = br.readLine();    
//                //发送数据  
//                dos.writeUTF(send);    
//            }
        	dos = new DataOutputStream(client.getOutputStream());
        	String send = "metrics:tcp\n";
        	dos.write(send.getBytes());
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally{  
            try{
                if(br != null){  
                    br.close();  
                }  
                if(client != null){  
                    client = null;  
                }  
            }catch(Exception e){  
                e.printStackTrace();  
            }  
        }  
    }  
}

如上两个类里面均有两个线程,分别处理读入和写入数据操作。

运行:

首先运行服务端,然后执行客户端,返回数据如下:

服务端:


客户端发过来的内容:metrics:tcp



发给客户端数据:TTLK38



发给客户端数据:TTLK5



发给客户端数据:TTLK97



发给客户端数据:TTLK80



发给客户端数据:TTLK21



发给客户端数据:TTLK58



...


客户端:


TTLK38



TTLK5



TTLK97



TTLK80



TTLK21



TTLK58



...