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 ,所有技术的更新和不断发展都是背后业务在驱动。人们追求高效率,高速度,高质量的通信,促使开源框架日新月异。关于开源通信框架以后再讲,和大家一起学习,谢谢大家观看!
原文:http://www.cnblogs.com/xums/p/6828446.html