JAVA Socket

Tcp的cs通信

一客户端向服务器发送消息,先启动服务器,后启动客户端,accept会一直等待。

服务器

//服务端
public class TcpServerDemo01 {

    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream is=null;
        ByteArrayOutputStream baos=null;
        try {
            //有一个地址(本地),端口999
            serverSocket=new ServerSocket(999);
            while (true)
               {
                   //等待客户端连接
                socket = serverSocket.accept();
                //读取客户端消息
                is = socket.getInputStream();

                //管道流
                baos = new ByteArrayOutputStream();
                byte[] buffer=new byte[1024];
                int len;
                while((len=is.read(buffer))!=-1){
                    baos.write(buffer,0,len);
                }
                System.out.println(baos.toString());
                for (int i = 0; i < buffer.length; i++) {
                    System.out.println(buffer[i]);
               }
System.out.println(new String(buffer,0,buffer.length)); } }
catch (IOException e) { e.printStackTrace(); } finally { if(baos==null){ try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } if(is==null) { try { is.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(); } } } } }

客户端

//客户端
public class TcpClientDemo01 {
    public static void main(String[] args) {
        try {
            //要知道服务端的地址和端口号
            InetAddress serverIp=InetAddress.getByName("127.0.0.1");
            int port =999;
            //创建一个socket连接
            Socket socket=new Socket(serverIp,port);
            //System.out.println(serverIp.toString());
            //发送消息给os
            OutputStream os =socket.getOutputStream();
            os.write("hell 世界".getBytes());
            os.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

这是客户端向服务器发送消息,服务器要有ip和端口号,

二,客户端向服务器发送图片文件

服务器

package Internet.lesson2;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TcpServerdemo02 {
    public static void main(String[] args) throws Exception {
        //创建服务
        ServerSocket serverSocket=new ServerSocket(9000);
        //监听客户端连接
        Socket socket = serverSocket.accept();//会一直等待
        System.out.println("连接成功");
        //获取输入流
        InputStream is = socket.getInputStream();
        //文件输出
        FileOutputStream fos = new FileOutputStream(new File("src/receives.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1)
        {
            fos.write(buffer,0,len);
        }
        //通知客户端接收完毕
        OutputStream os=socket.getOutputStream();
        os.write("我接受完毕了".getBytes(StandardCharsets.UTF_8));
        fos.close();
        is.close();
        socket.close();
    }
}

客户端


public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
        //创建一个socekt连接
        Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9000);
        //创建一个输出流
        OutputStream os=socket.getOutputStream();
        //读取文件
        FileInputStream fis=new FileInputStream(new File("imgTcp02.jpg"));//imgTcp02为下载好的图片
        //写出文件
        byte[] buffer=new byte[1024];
        int len;
        while ((len=fis.read(buffer))!=-1)
        {
            os.write(buffer,0,len);
        }
       
        fis.close();
        os.close();
        socket.close();
    }
}

 三,Udp的通信

客户端,udp没有服务器。

package Internet.lesson2.lesson3;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class UdpClient01 {
    public static void main(String[] args) throws Exception {
        //建立一个socket
        DatagramSocket socket=new DatagramSocket();
        //建个包
        String msg="你好,服务器";
//发送给谁
        InetAddress localhosts = InetAddress.getByName("localhost");
        int port =9090;
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhosts, port);

        //发送包
        socket.send(packet);
        socket.close();
    }
}

服务器

public class UdpServer02 {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接受数据
        byte[] buffer =  new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        socket.receive(packet);
        System.out.println(packet.getAddress());//地址127.。。。
        System.out.println(new String(packet.getData()));//数据
        System.out.println(packet.toString());//java.net.DatagramPacket@66a29884
        //关闭连接
        socket.close();
    }
}

四,双向通信,

新建一个Talksender继承Runnable接口

public class Talksender implements  Runnable{

    DatagramSocket socket=null;
    BufferedReader reader =null;

    private int myport;
    private String toIp;
    private  int toPort;

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

    @Override
    public void run() {

        //准备数据

        while (true){
            String data= null;
            try {
                //System.out.print("我说");
                data = reader.readLine();
                byte[] datas=data.getBytes(StandardCharsets.UTF_8);
                DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPort));
                //发送
                socket.send(packet);
                if (data.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

新建一个TalkReceive,继承Runnable接口

public class Talkreceive implements Runnable{
    String fromName;
    DatagramSocket socket=null;
    private int port;

    public Talkreceive(String fromName, int port) {
        this.fromName = fromName;
        this.port = port;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true){
            try {
                byte[] bytes = new byte[1024];
                DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
                socket.receive(packet);//接受消息
                byte[] data = packet.getData();
                String s = new String(data,0,data.length);
                System.out.println(fromName+":"+s);//输出来者消息
                if (s.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

新建学生类

package Internet.lesson2.lesson3.chat;

public class TalkStudent {
    public static void main(String[] args) {
         new Thread(new Talksender(7777,"localhost",9999)).start();//发送到9999窗口
         new Thread(new Talkreceive("老师",8888)).start();//从8888窗口接受
    }
}

新建老师类

package Internet.lesson2.lesson3.chat;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new Talksender(5555,"localhost",8888)).start();
        new Thread(new Talkreceive("学生",9999)).start();
    }
}

 运行老师类和学生类,发送时没有发送名字,接受时才知道来着名字。

五,udp发送控制台输入消息

服务端

 

package Internet.lesson2.lesson3.chat;

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

public class Udpreceive {
public static void main(String[] args) throws Exception {

DatagramSocket socket = new DatagramSocket(6666);
while (true){
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
socket.receive(packet);//接受消息
byte[] data = packet.getData();
String s = new String(data,0,data.length);
System.out.println(s);
if (s.equals("bye")){
break;
}


}
socket.close();


}
}
客户端
package Internet.lesson2.lesson3.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class Udpsender {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
//准备数据
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data=reader.readLine();
byte[] datas=data.getBytes(StandardCharsets.UTF_8);
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
//发送
socket.send(packet);
if (data.equals("bye")){
break;
}
}

socket.close();
}
}

本人学生,技术不行,跟着网上的课程敲得,如果有差错,请指正,万分感谢。网课为狂神study。。

posted @ 2022-01-21 17:35  苦丁茶也可以  阅读(463)  评论(0)    收藏  举报