Java Socket通信(TCP/UDP)

以前寫過一個局域網通信工具,很簡單的。但是這系列文章是用來解決新手問題的。所以打算寫個最簡單的demo。

廢話少說,先來個基於TCP的。

上server端代碼:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class MyServiceSocket {
 
    public static void main(String[] args) {
        try {
            // 1.建立一個服務器socket對象
            ServerSocket ss = new ServerSocket(8888);
 
            // 2.等待客戶端連接
            Socket s = ss.accept();// 等到客戶端連接
 
            // 通過輸入輸出流操作數據
            InputStream is = s.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            System.out.println(dis.readUTF());
 
            OutputStream out = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(out);
            dos.writeUTF("hello client!");
 
            // 4.關閉數據流
            dis.close();
            is.close();
            s.close();
            ss.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}
客戶端代碼:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
 
public class MyClient {
 
    public MyClient() {
    }
 
    public static void main(String[] args) {
        try {
            // 1.建立Socket對象
            Socket client = new Socket("localhost", 8888);
 
            // 2.通過socket對象的輸入輸出流操作數據
            OutputStream out = client.getOutputStream();
            DataOutputStream dos = new DataOutputStream(out);
            dos.writeUTF("hello service!");
 
            InputStream is = client.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            System.out.println(dis.readUTF());
 
            System.out.println(client.getInetAddress());
            System.out.println(client.getLocalPort());
            System.out.println(client.getLocalSocketAddress());
            System.out.println(client.getChannel());
            // 3.關閉連接
            dos.close();
            out.close();
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}



再來一個基於UDP的。

server端代碼:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
 
public class MyUDPServer {
 
    public static void main(String[] args) {
        byte b[] = new byte[100];
        try {
 
            DatagramPacket dp = new DatagramPacket(b, b.length);
            DatagramSocket ds = new DatagramSocket(8888);
 
            ds.receive(dp);
            String s = "你發的數據是:" + new String(b).trim();
            System.out.println(s);
 
            dp = new DatagramPacket(s.getBytes(), s.getBytes().length,
                    dp.getAddress(), dp.getPort());
            ds = new DatagramSocket();
            ds.send(dp);
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
}

Client端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
 
/**
 * 類說明:UDP數據包 udp 總結 1.將要發的數據先進行打包 使用的類是:DatagramPacket 2.發送打包好的數據
 * 使用的類是:DatagramSocket (發送數據包) 注意事項:發送數據報是要知道目的地和目的端口號
 * 所以要採用DatagramPacket(byte[] buf, int length,InetAddress address,int port)
 * 因爲發送的時候已經知道端口號 故發送DatagramSocket()不需要再寫參數了
 * 
 * 接收數據包: 1.接收的時候要將接受的數據打包DatagramPacket(byte[] buf, int length)
 * 2.接收的時候要知道重那個端口接收 故使用的時候要DatagramSocket(int prot);
 * 
 */
public class MyUDPClient {
    public static void main(String[] args) {
        byte b[] = "hello udp server!".getBytes();
        try {
            InetAddress add = InetAddress.getByName("localhost");
 
            DatagramPacket dp = new DatagramPacket(b, b.length, add, 8888);
            DatagramSocket ds = new DatagramSocket();
 
            ds.send(dp);
 
            b = new byte[100];
            dp = new DatagramPacket(b, b.length);
            ds.receive(dp);
            System.out.println(new String(b).trim());
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
}

來於:http://blog.csdn.net/withiter/article/details/17226405#,有刪改。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章