1. 程式人生 > >Java網絡編程【Socket服務端和客戶端】

Java網絡編程【Socket服務端和客戶端】

rgs .net aio highlight 如果 org author oid try

Socket 編程大家都不陌生,Java 學習中必學的部分,也是 Java網絡編程核心內容之一。Java 網絡編程又包括 TCP、UDP,URL 等模塊。TCP 對應 Socket模塊,UDP 對應 DatagramPacket 模塊。URL 對應 URL 模塊。其中 TCP 和 UDP 是網絡傳輸協議,TCP 是數據流傳輸協議,UDP 是數據包傳輸協議。兩者之間的異同就不在這裏說了,推薦一本入門書籍 《TCPIP入門經典》。我們開始 Socket 服務端和客戶端編程吧。

一、Socket 服務端

package www.rockcode.com.tnetty.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author xums
 * SocketServer
 * TODO
 * 2017年5月4日-上午11:07:49
 */
public class SocketServer {

	public static void main(String[] args) {
		
		SocketServer server = new SocektServer();
server.init(); } public void init(){ ServerSocket serverSocket = null; Socket socket = null; BufferedReader br = null; PrintWriter pw = null; try { serverSocket = new ServerSocket(9999); socket = serverSocket.accept(); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(socket.getOutputStream()); String msg = br.readLine(); while(null!=msg){ System.out.println("收到消息:"+msg); msg = br.readLine(); } } catch (IOException e) { e.printStackTrace(); }finally{ if(null!=pw){ pw.close(); } if(null!=br){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(null!=socket){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

  

 二、Socket 客戶端

package www.rockcode.com.tnetty.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * @author xums
 * SocketClient
 * TODO
 * 2017年5月4日-上午10:47:20
 */
public class SocketClient {
	
	public static void main(String[] args) {
		
		SocketClient client = new SocketClient();
                client.init();

	}

		
	public void init(){
		Socket socket = null;
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			socket = new Socket();
			socket.connect(new InetSocketAddress(9999), 5000);
			socket.setKeepAlive(true);//默認false
			
			if(socket.isConnected()){
				
				br = new BufferedReader(new InputStreamReader(System.in));
				pw = new PrintWriter(socket.getOutputStream(),true);//如果第二個參數不選擇 true 或者 只選一個參數,那麽發完消息要記得 flush()
				String msg = "";
				
				while(true){
					
					boolean alive = socket.getKeepAlive();//判斷服務端是否在線
											
					if(!alive){
						throw new Exception("服務端不在線!");
					}else{
						msg = br.readLine();
						if(null!=msg){
							System.out.println("發送消息:"+msg);
							pw.println(msg);
                                                        //pw.flush();
						}
					}
				}
				
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}finally{
			if(null!=pw){
				pw.close();
			}
			
			if(null!=br){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(null!=socket){
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	
}

Socket 編程是必須熟悉的知識點,即使現在有不少的開源通信框架出現,例如 Mina、Netty、Cindy 等等。現在商業上用的最多還是 Netty,從最原始的 Java IO 到 Java NIO,再到 Java AIO,再到 Netty 等。其底層離不開 Socket ,所有技術的更新和不斷發展都是背後業務在驅動。人們追求高效率,高速度,高質量的通信,促使開源框架日新月異。關於開源通信框架以後再講,和大家一起學習,謝謝大家觀看!


Java網絡編程【Socket服務端和客戶端】