1. 程式人生 > 其它 >JAVA學習-網路程式設計

JAVA學習-網路程式設計

TCP實現聊天(Local)

服務端

package com.myTCP.chatDemo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerChat {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        ByteArrayOutputStream baos = null;
        try {
            //服務端需要一個地址
            serverSocket = new ServerSocket(829);
            //服務端等待客戶端的連線 accept方法,就是等待客戶端連線
            socket = serverSocket.accept();
            //讀取客戶端訊息 
            inputStream = socket.getInputStream();
            //管道流用於輸出
            baos =new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int Len;
            while ((Len = inputStream.read(bytes)) != -1){
                baos.write(bytes,0 ,Len);
            }
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (baos != null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

客戶端

package com.myTCP.chatDemo;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientChat {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        try {
            //獲得服務端IP
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //填寫服務端IP和埠到客戶端
            socket = new Socket(serverIP,829);
            //輸出流連到客戶端的輸出方法
            os = socket.getOutputStream();
            //輸出流輸出內容
            os.write("hello,world!".getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

TCP檔案上傳(Local)

UDP發簡訊(Local)

初級

傳送端

package com.myUDP.chatDemo01;

import java.net.*;

public class mySend {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket();
            String msg ="hello,world";
            InetAddress localhost = InetAddress.getByName("localhost");
            int port = 829;
            DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.length(),localhost,port);
            socket.send(packet);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
}

接收端

package com.myUDP.chatDemo01;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.net.SocketException;

public class myReceive {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        DatagramPacket packet = null;
        try {
            socket = new DatagramSocket(829);//設定自己接收的埠
            byte[] buffer = new byte[1024];//緩衝區
            packet = new DatagramPacket(buffer,0,buffer.length);//接收資料包
            socket.receive(packet);//阻塞式監聽
            System.out.println(new String(packet.getData(),0,packet.getLength()));//輸出資料包接收到的內容

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket != null){
                socket.close();
            }
        }
    }
}

實現控制檯迴圈傳送

傳送端:

package com.myUDP.demo02;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;

public class Demo02 {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(666) ;

            while (true){

                byte[] bytes = new byte[1024];
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                String sendBytes = reader.readLine();
                bytes = sendBytes.getBytes();

                InetAddress inetAddress = InetAddress.getLocalHost();

                DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,inetAddress,888 );

                socket.send(packet);

                if (sendBytes.equals("bye")){
                    break;
                }
            }

            socket.close();
            

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

接收端

package com.myUDP.demo02;

import java.net.DatagramPacket;
import java.net.DatagramSocket;


public class Demo02b {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(888);
            while (true){

                byte[] buff = new byte[1024];

                DatagramPacket packet = new DatagramPacket(buff,0,buff.length);

                socket.receive(packet);


                System.out.println(new String(buff,0, packet.getLength()));//注意,這裡必須是獲取packet的長度,byte[]的長度是1024!!

                if (new String(buff,0, packet.getLength()).equals("bye")){
                    break;
                }
            }
            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

實現多執行緒互動式聊天

傳送訊息執行緒

package com.myUDP.demo04;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendMsg implements Runnable{
    DatagramSocket socket;
    BufferedReader reader;
    private int toIP;
    private int fromIP;

    public SendMsg(int toIP, int fromIP) {
        this.toIP = toIP;
        this.fromIP = fromIP;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket(fromIP) ;
            reader = new BufferedReader(new InputStreamReader(System.in));
            while (true){

                byte[] bytes = new byte[1024];

                String sendBytes = reader.readLine();
                bytes = sendBytes.getBytes();

                InetAddress inetAddress = InetAddress.getLocalHost();

                DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,inetAddress,toIP );

                socket.send(packet);

                if (sendBytes.equals("bye")){
                    break;
                }
            }

            socket.close();
            System.exit(0);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

接收訊息執行緒

package com.myUDP.demo04;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveMsg implements Runnable{
    DatagramSocket socket;
    private int recIP;
    private String recName;

    public ReceiveMsg(int recIP, String recName) {
        this.recIP = recIP;
        this.recName = recName;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket(recIP);
            while (true){

                byte[] buff = new byte[1024];

                DatagramPacket packet = new DatagramPacket(buff,0,buff.length);

                socket.receive(packet);


                System.out.println(recName+":"+new String(buff,0, packet.getLength()));//注意,這裡必須是獲取packet的長度,byte[]的長度是1024!!

                if (new String(buff,0, packet.getLength()).equals("bye")){
                    break;
                }
            }
            socket.close();
            System.exit(0);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客戶端啟動執行緒

package com.myUDP.demo04;

public class Student {
    public static void main(String[] args) {
        new Thread(new SendMsg(888,01)).start();
        new Thread(new ReceiveMsg(666,"老師")).start();
    }
}
////////////////////////////////
package com.myUDP.demo04;

public class Teacher {
    public static void main(String[] args) {
        new Thread(new SendMsg(666,02)).start();
        new Thread(new ReceiveMsg(888,"學生")).start();
    }
}

關於try-catch遇到的問題

注意一個問題!!! try-catch 裡面new的物件一旦離開了try-catch就沒了,會出現空指標異常。

但如果是放在構造器裡面,相當於一出生就new了,是可以使用的!!!

例如,舉個例子,傳送執行緒:

package com.myUDP.demo03;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendMsg implements Runnable {
    DatagramSocket socket = null;
    DatagramPacket packet = null;
    private int toPort;
    private int formPort;
    BufferedReader reader = null;

    public SendMsg( int toPort, int formPort) {
        this.toPort = toPort;
        this.formPort = formPort;
        try {
            this.socket = new DatagramSocket(formPort);
            this.reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {


            try {
                while (true){
                    //String sendBytes = this.reader.readLine();
                    byte[] bytes = this.reader.readLine().getBytes(); //這裡不要定義1024,因為不清楚具體長度

                    this.packet = new DatagramPacket(bytes,0,bytes.length,InetAddress.getLocalHost(),toPort);
                    this.socket.send(packet);
                    String sendBytes = new String(bytes,0, bytes.length);
                    if (sendBytes.equals("bye")){
                        break;
                }


                    socket.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }


    }
}