首页 > 技术文章 > Java 学习之网络编程案例

ksWorld 2017-04-27 17:14 原文

网络编程案例

一,概念

1,网络编程不等于网站编程

2,编程只和传输层打交道,即TCP和UDP两个协议

二,案例

1,TCP实现点对点的聊天

Server端:两个输入流:读客户端和控制台,一个输出端:输出客户端

 

public class ChatServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket=new ServerSocket(44432);
            Socket socket=serverSocket.accept();//获取客户端的连接信息
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//client 的输入内容
            PrintWriter printWriter =new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//往client输出内容
            System.out.println("client say:"+bufferedReader.readLine());
            Scanner bufferedReader1=new Scanner(System.in);//控制台输入内容
            String message=bufferedReader1.next();
            while(!message.equals("end")) {
                printWriter.println(message);//send message to client
                printWriter.flush();
                System.out.println("client say:"+bufferedReader.readLine());// get message from client
                message=bufferedReader1.next();
            }
            bufferedReader.close();
            printWriter.close();
            bufferedReader1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

Client端:两个输入流:读服务端和控制台,一个输出端:输出服务端

public class ChatClient {
    public static void main(String[] args) {
        try {
            Socket socket=new Socket("127.0.0.1",44432);//获取服务端的唯一标识
            PrintWriter printWriter=new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//BufferedWriter流也可以
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedReader bufferedReader1=new BufferedReader(new InputStreamReader(System.in));
            String message=bufferedReader1.readLine();
            while (!message.equals("end")){
                printWriter.write(message+"\r\n");//加\r\n,因为读取时是用readLine方式 ,等同于println方式
                printWriter.flush();//必须flush,不然另一端读不到。。。
                System.out.println("server say:"+bufferedReader.readLine());
                message=bufferedReader1.readLine();
            }
            bufferedReader.close();
            bufferedReader1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2,UDP 实现高精度数字传输   通过数据报形式

接收端:

public class UdpServer {
    public static void main(String[] args) {
        byte[] buf=new byte[1024];//存储接受数据报的容器
        DatagramPacket datagramPacket=new DatagramPacket(buf,buf.length);//数据报内容写入容器
        try {
            DatagramSocket datagramSocket=new DatagramSocket(44423);
            while (true){
                datagramSocket.receive(datagramPacket);//接收发送方的数据报
                ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(buf);
                DataInputStream dataInputStream=new DataInputStream(byteArrayInputStream);
                System.out.println("clint say:"+dataInputStream.readDouble());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

发送端:

public class UdpClient {
    public static void main(String[] args) {
        double n=10000.00;
        try {
            ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
            DataOutputStream dataOutputStream=new DataOutputStream(byteArrayOutputStream);
            dataOutputStream.writeDouble(n);
            //创建代有数据报内容和目的地址
            DatagramPacket datagramPacket=new DatagramPacket(byteArrayOutputStream.toByteArray(),
                    byteArrayOutputStream.toByteArray().length,new InetSocketAddress("127.0.0.1",44423));
            DatagramSocket datagramSocket=new DatagramSocket(53421);//指定发送的端口
            datagramSocket.send(datagramPacket);

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

 

 

 

 

 

 

 

推荐阅读