這是一個超簡單的Client Server範例,Server部份利用Thread來常駐執行,而Client利用Socket去連接指定的port,送出一個字元組給OutputStream,而Server接收到請求後,使用InputStream來取得資料。
這裡有篇介紹Socket Server的原理Thread應用-Java SocketServer,還有一篇傳送物件Serializable序列化Socket傳送範例,這篇算是比較進階。
程式碼包裝在jar裡,利用二個command視窗,一個執行Server一個執行Client,結果如下:
原始碼及jar下載:
主要的Server端程式碼
package test; import java.net.ServerSocket; import java.net.Socket; public class SocketServer extends java.lang.Thread { private boolean OutServer = false; private ServerSocket server; private final int ServerPort = 8765;// 要監控的port public SocketServer() { try { server = new ServerSocket(ServerPort); } catch (java.io.IOException e) { System.out.println("Socket啟動有問題 !"); System.out.println("IOException :" + e.toString()); } } public void run() { Socket socket; java.io.BufferedInputStream in; System.out.println("伺服器已啟動 !"); while (!OutServer) { socket = null; try { synchronized (server) { socket = server.accept(); } System.out.println("取得連線 : InetAddress = " + socket.getInetAddress()); // TimeOut時間 socket.setSoTimeout(15000); in = new java.io.BufferedInputStream(socket.getInputStream()); byte[] b = new byte[1024]; String data = ""; int length; while ((length = in.read(b)) > 0)// <=0的話就是結束了 { data += new String(b, 0, length); } System.out.println("我取得的值:" + data); in.close(); in = null; socket.close(); } catch (java.io.IOException e) { System.out.println("Socket連線有問題 !"); System.out.println("IOException :" + e.toString()); } } } public static void main(String args[]) { (new SocketServer()).start(); } }
Client端程式碼
package test; import java.net.InetSocketAddress; import java.net.Socket; import java.io.BufferedOutputStream; public class SocketClient { private String address = "127.0.0.1";// 連線的ip private int port = 8765;// 連線的port public SocketClient() { Socket client = new Socket(); InetSocketAddress isa = new InetSocketAddress(this.address, this.port); try { client.connect(isa, 10000); BufferedOutputStream out = new BufferedOutputStream(client .getOutputStream()); // 送出字串 out.write("Send From Client ".getBytes()); out.flush(); out.close(); out = null; client.close(); client = null; } catch (java.io.IOException e) { System.out.println("Socket連線有問題 !"); System.out.println("IOException :" + e.toString()); } } public static void main(String args[]) { new SocketClient(); } }
啟動Main
package test; public class Main { public static void main(String args[]) { if(args.length==0) System.out.println("請傳入參數server或client"); if(args[0].equals("server")) (new SocketServer()).start(); else new SocketClient(); } }
大大想請教您:
如果我想傳遞的是一串16進位的bytes, 比如說 “03060038000039e6” 共8個bytes,取代”Send From Client “.getBytes() , 應該如何改寫? 網路上有一堆範例,您這個最接近我想要的,但就只差在傳遞的不是字串而是bytes? 找來找去改來改進總不正確,能否麻煩您修改一下,感謝!!