1. 程式人生 > >026.3 網絡編程 TCP聊天

026.3 網絡編程 TCP聊天

while class 我想 exceptio clas 創建服務 his 哪裏 步驟

分為客戶端和服務端,分別進行收發操作
##########################################################################
客戶端:
###思路:
1、建立tcp客戶端服務
1.1因為是面向連接,必須有連接才有通信
1.2在創建客戶端時,就必須明確目的地址和端口
2、一旦連接建立,就有了傳輸數據的通道。就可以在通道中進行數據傳輸,這個傳輸是通過流實現的,是socket io流
3、獲取socket io中的寫動作就可以發送給服務端

###步驟:
1、創建socket對象,明確目的IP和端口
2、通過socket對象的getOutStream方法獲取OutputStream對象
3、通過OutputStream對象寫數據,實現發送
4、關閉socket對象

###代碼:
System.out.println("client start");
//1、創建客戶端對象,明確目的和端口
Socket s = new Socket("192.168.10.141",10000);
//2、獲取socket流中的輸出流,將數據發送給服務端
OutputStream out = s.getOutputStream();
//3、通過輸出流寫數據
out.write("I miss you".getBytes());
//4、關閉資源
s.close();

####################################################################
服務端:
###思路:
1、創建socket服務器端服務。服務器監聽一個端口
2、獲取客戶端對象
3、獲取客戶端的socket流的讀取流
4、顯示

###步驟:
1、創建ServerSocket服務器對象
2、通過ServerSocket對象的accept方法,獲取客戶端socket對象
3、通過客戶端socket對象的getInetAddress().getHostAddress() 方法獲取ip對象然後獲取ip
4、通過客戶端socket對象的getInputStream方法獲取InputStream對象
5、通過InputStream對象的read方法獲取客戶端發送的數據。
6、關閉客戶端socket對象。

###代碼:
System.out.println("服務器啟動。。。");
//1、創建服務器端對象
ServerSocket ss = new ServerSocket(10003);
//2、獲取客戶端對象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connect");
//3、通過客戶端對象獲取socket流的讀取流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf); String str = new String(buf,0,len); System.out.println(str); s.close();

################################################################################
簡單互動的TCP通訊

/*###
 * 案例二:實現客戶端和服務端的收發過程。
 * 客戶端
 */
System.out.println("客戶端2 啟動.......");
//        創建客戶端socket對象。明確服務端地址和端口。
Socket s = new Socket("192.168.1.223", 10004);
//        發送數據,通過socket輸出流完成。
OutputStream out = s.getOutputStream();
out.write("服務端,我來了".getBytes());
//        讀取服務端返回的數據,通過socket輸入流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//        關閉資源。
s.close();

/*###
 * 案例二:實現客戶端和服務端的收發過程。 服務器端。
 */
System.out.println("服務端2啟動.....");
// 創建tcp服務端socket 明確端口。
ServerSocket ss = new ServerSocket(10004);
while (true) {
    // 獲取客戶端對象。
    Socket s = ss.accept();
    System.out.println(s.getInetAddress().getHostAddress()
            + ".....connected");
    // 讀取客戶端的發送過來的數據
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String text = new String(buf, 0, len);
    System.out.println(text);
    // 給客戶端回饋數據。
    OutputStream out = s.getOutputStream();
    out.write("客戶端,我已到收到,哦耶!".getBytes());
    // 關閉客戶端
    s.close();
}
// 關閉服務端。如果不斷的獲取客戶端,不用關閉服務端。
//        ss.close();

###########################################################################
我想寫一個可以多次發送信息的程序,沒有找到哪裏錯了

技術分享圖片
public class TCPServer2
{
    public static void main(String[] args) throws IOException
    {
        ServerSocket ss = new ServerSocket(10005);
        Socket s = ss.accept();
        ServerReceive sr = new ServerReceive(s);
        ServerSend ssend = new ServerSend(s);
        new Thread(sr).start();
        new Thread(ssend).start();
    }
}


class ServerSend implements Runnable{
    private Socket s;
    private OutputStream os;
    public ServerSend(Socket s) throws IOException {
        super();
        this.s = s;
        os = s.getOutputStream();
    }

    @Override
    public void run()
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        try {
            while((line = br.readLine()) != null){
                
                os.write(line.getBytes());
                
                if("//over".equals(line)){
                    break;
                }
            }
            s.close();
        } catch (IOException e) {
        }
    }
}

class ServerReceive implements Runnable{
    private Socket s;
    private InputStream is;
    public ServerReceive(Socket s) throws IOException {
        super();
        this.s = s;
        is = s.getInputStream();
    }

    @Override
    public void run()
    {
        while(true){
            byte[] buf = new byte[1024];
            try {
                int len = is.read(buf);
                String str = new String(buf,0,len);
                if("//over".equals(str)){
                    break;
                }
                System.out.println(str);
                s.close();
            } catch (IOException e) {
            }
        }
    }
}
TCPServer 技術分享圖片
public class TCPClient2
{
    public static void main(String[] args) throws UnknownHostException, IOException
    {
        Socket bothSocket = new Socket("127.0.0.1",10005);
        Send2 send = new Send2(bothSocket);
        Receive2 receive = new Receive2(bothSocket);
        
        new Thread(send).start();
        new Thread(receive).start();
        
    }
}

//創建發送和接收的類,使用多線程,繼承runnable接口
//多線程發送類
class Send2 implements Runnable{
    private Socket s;
    OutputStream os;
    public Send2(Socket s) throws IOException {
        super();
        this.s = s;
        os = s.getOutputStream();
    }
    @Override
    public void run()
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        try {
            while((line = br.readLine()) != null){
                
                os.write(line.getBytes());
                
                if("//over".equals(line)){
                    break;
                }
            }
            s.close();
        } catch (IOException e) {
        }
    }
}

//多線程接收類
class Receive2 implements Runnable{
    private Socket s;
    
    private InputStream is;
    public Receive2(Socket s) throws IOException {
        super();
        this.s = s;
    }

    @Override
    public void run()
    {
        while(true){
            byte[] buf = new byte[1024];
            try {
                is = s.getInputStream();
                int len = is.read(buf);
                String str = new String(buf,0,len);
                if("//over".equals(str)){
                    break;
                }
                System.out.println(str);
                s.close();
            } catch (IOException e) {
            }
        }
    }
}
TCPClient

026.3 網絡編程 TCP聊天