首页 > 代码库 > Java网络编程【Socket服务端和客户端】

Java网络编程【Socket服务端和客户端】

  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服务端和客户端】