Socket通信

本文详细介绍了Socket通信中TCP和UDP协议的实现。TCP协议部分阐述了客户端和服务器端Socket的创建、数据收发及资源释放,还说明了多客户端通信的实现思路;UDP协议部分介绍了客户端和服务器端的数据发送、接收及回应流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Socket通信

在这里插入图片描述

一.TCP协议

1.Socket:客户端的Socket
*
1.创造客户端的Socket
*
2.通过输出流,请求发出
*
3.输入流接收服务器的回应 //首先关闭客户端的输出流 客户端.shutdownOutput( )方法,得到输入流读取回应
*
4.释放资源

package cn.com.abner.intener.TCPdemo1.传数据;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Coco1 {
    public static void main(String[] args) {
        //客户端接口
        try {
            Socket coco=new Socket("localhost",5000);
            String info="Abner";
            OutputStream a=coco.getOutputStream();
            byte[] infos=info.getBytes();
            a.write(infos);
            
            //输入流接收服务器的回应
            coco.shutdownOutput();   //关闭客户端的输出流
            InputStream d=coco.getInputStream();
            BufferedReader f=new BufferedReader(new InputStreamReader(d));
            String reply;
            while((reply=f.readLine())!=null) {
                System.out.println("服务器回应"+reply);
            }
            f.close();
            d.close();
            a.close();
            coco.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }        
    }
}
* 

2.ServerSocket:服务器端的Socket
*
1.创建一个Socket
*
2.监听的方法 accept( ) //监听并接收到端口中
*
3.获得输入流,获得用户请求 //服务器的输入流即为来自客户端的输入
*
4.回应客户端:通过输出流回应客户端 //服务器的输出流即为往客户端输出
*
5.释放相应资源

package cn.com.abner.intener.TCPdemo1.传数据;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 {
    public static void main(String[] args) {
        //获取端口
        try {
            ServerSocket server=new ServerSocket(5000);
            //监听
            Socket coco=server.accept();
            //输入流
            InputStream a=coco.getInputStream();            //服务器的输入即为从客户端的输入
            BufferedReader b=new BufferedReader(new InputStreamReader(a));
            String info;
            while((info=b.readLine())!=null) {
                System.out.println("客户输入"+info);
            }
            
            //给客户端一个回应
            String reply=" 欢迎登陆";
            //通过输出流
            OutputStream c=coco.getOutputStream();            //服务器的输出即为往客户端的输出
            c.write(reply.getBytes());
            
            //关
            c.close();
            b.close();
            a.close();
            coco.close();
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

*** 传递对象之前,必须实现Serializable接口**

package cn.com.abner.intener.TCPdemo2传对象;
import java.io.Serializable;
public class person implements Serializable {
     private String name;
     private String mima;
     
     public person() {
     }
     public person(String name, String mima) {
          this.name = name;
          this.mima = mima;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
     public String getMima() {
          return mima;
     }
     public void setMima(String mima) {
          this.mima = mima;
     }
     
}
package cn.com.abner.intener.TCPdemo2传对象;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 {
    public static void main(String[] args)  {
        //获取端口
        try {
            ServerSocket server=new ServerSocket(5000);
            //监听
            Socket coco=server.accept();
            //输入流
             InputStream a=coco.getInputStream();
            ObjectInputStream b=new ObjectInputStream(a);
            
            person ps = null;
            try {
                ps = (person)b.readObject();
                System.out.println("客户端输入姓名为 "+ps.getName()+"密码为 "+ps.getMima());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    

            
            //给客户端一个回应
            String reply=" 欢迎登陆";
            //通过输出流
            OutputStream c=coco.getOutputStream();            //服务器的输出即为往客户端的输出
            c.write(reply.getBytes());
            
            //关
            c.close();
            b.close();
            a.close();
            coco.close();
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package cn.com.abner.intener.TCPdemo2传对象;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Coco1 {
    public static void main(String[] args) {
        //客户端接口
        try {
            Socket coco=new Socket("localhost",5000);
            //发送请求
            person ps=new person("Abner","12345");
            
            OutputStream a=coco.getOutputStream();
            ObjectOutputStream b=new ObjectOutputStream(a);
            
            b.writeObject(ps);
            
            //输入流接收服务器的回应
            coco.shutdownOutput();   //关闭客户端的输出流
            InputStream d=coco.getInputStream();
            BufferedReader f=new BufferedReader(new InputStreamReader(d));
            String reply;
            while((reply=f.readLine())!=null) {
                System.out.println("服务器回应"+reply);
            }
            f.close();
            d.close();
            a.close();
            b.close();
            coco.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

3.实现多客户端通行
*
思路:在服务器端根据不同的客户端执行不同的线程

package cn.com.abner.intener.TCPdemo3多线程;
import java.io.Serializable;
public class person implements Serializable {
     private String name;
     private String mima;
     
     public person() {
     }
     public person(String name, String mima) {
          this.name = name;
          this.mima = mima;
     }
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
     public String getMima() {
          return mima;
     }
     public void setMima(String mima) {
          this.mima = mima;
     }
     
}
	* 

线程类
*
接收客户端请求,回复回应
每一个线程构造方法绑定一个客户端的socket
*/

import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.Socket;

public class ServerThread extends Thread{
    private Socket coco;
    //每一个线程构造方法绑定一个客户端的socket
    public ServerThread(Socket coco) {
        this.coco = coco;
    }
    
    //接收客户端请求,回复回应
    public void run() {

        try {
        //输入流
        InputStream a=coco.getInputStream();
        ObjectInputStream b=new ObjectInputStream(a);
        
        person ps = null;
        try {
            ps = (person)b.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("客户端输入姓名为 "+ps.getName()+"密码为 "+ps.getMima());
        
        //获得客户端的IP
        InetAddress ia=coco.getInetAddress();
        String IP=ia.getHostAddress();
        System.out.println("相对应的IP为 "+IP);


        
        //给客户端一个回应
        String reply=" 欢迎登陆";
        //通过输出流
        OutputStream c=coco.getOutputStream();            //服务器的输出即为往客户端的输出
        c.write(reply.getBytes());
        
        //关
        c.close();
        b.close();
        a.close();
        coco.close();
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}
* 

服务器端
*
1.获取服务器端口
*
2.监听 //因为要接收多个客户端请求,要一直处于监听状态(无限循环实现)
*
3.在循环内,监听–>创建一个和该客户端响应的线程–>启动线程

package cn.com.abner.intener.TCPdemo3多线程;
//服务器端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args)  {
        //获取端口
        try {
            ServerSocket server=new ServerSocket(5000);
            //一直监听状态
            while(true) {
            Socket coco=server.accept();
            //创建一个和该客户端响应的线程
            ServerThread a=new ServerThread(coco);
            //启动线程
            a.start();
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
* 

客户端不发生变化
*
1.创造客户端的Socket
*
2.通过输出流,请求发出
*
3.输入流接收服务器的回应 //首先关闭客户端的输出流 客户端.shutdownOutput( )方法,得到输入流读取回应
*
4.释放资源

package cn.com.abner.intener.TCPdemo3多线程;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Coco1 {
    public static void main(String[] args) {
        //客户端接口
        try {
            Socket coco=new Socket("localhost",5000);
            //发送请求
            person ps=new person("Abner","12345");
            
            OutputStream a=coco.getOutputStream();
            ObjectOutputStream b=new ObjectOutputStream(a);
            
            b.writeObject(ps);
            
            //输入流接收服务器的回应
            coco.shutdownOutput();   //关闭客户端的输出流
            InputStream d=coco.getInputStream();
            BufferedReader f=new BufferedReader(new InputStreamReader(d));
            String reply;
            while((reply=f.readLine())!=null) {
                System.out.println("服务器回应"+reply);
            }
            f.close();
            d.close();
            a.close();
            b.close();
            coco.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

}

二.UDP协议

DatagramSocket (服务器客户端)
*
1.客户端
*
发送数据
*
1.定义发送数据
*
2.将数据打散到byte数组中
*
3.获取对方的主机
*
4.创造客户端发送端口
*
5.将数据打包成数据包(需要2的字节数组,和3的对方主机,才能完成打包)
*
6.客户端口发送数据包(需要4的客户端口和5的数据包,才能完成发送)
*
收取服务器回应
*
1.定义收取包
*
2.在端口把数据包放在收取包中
*
3,取出数据包中的数据
*
释放资源

package cn.com.abner.intener.UDPdemo1数据;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Coco {
    public static void main(String[] args) {
        //数据
        String info="Allen";
        //打散数据
        byte[] infos=info.getBytes();
        //对方的地址和端口
        InetAddress ia;
        //创造端口
        DatagramSocket coco;
        try {
            ia = InetAddress.getByName("localhost");
        
        //将数据打包成数据包
        DatagramPacket dp=new DatagramPacket(infos, infos.length,ia ,5000 );
        
        coco=new DatagramSocket();
        //端口发送数据
        coco.send(dp);
        
        //收取服务器回应
        //收取包
        byte[] replys=new byte[1024];
        DatagramPacket rp=new DatagramPacket(infos,infos.length);
        //端口接收
        coco.receive(rp);
        //取出数据包中的数据
        String reply=new String(rp.getData(),0,rp.getData().length);
        System.out.println("服务器回应 "+reply);
        
        coco.close();    
        
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (SocketException e1) {
            e1.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

}

2.服务器端
收取服务器回应
1.定义收取包
2.创造服务器的接收端
3.在端口把数据包放在收取包中
4.取出数据包中的数据
回应客户端
1.定义回应数据
2.获取服务器中的端口地址
3.打包回应的数据
4.发送回应数据包
释放资源
package cn.com.abner.intener.UDPdemo1数据;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.net.SocketException;

public class Server {
    public static void main(String[] args) {
        //收取包
        byte [] infos=new byte[1024];
        DatagramPacket dp=new DatagramPacket(infos,infos.length);
        //创造接收端口
        try {
            DatagramSocket server=new DatagramSocket(5000);
            //取出数据到收取包中
            server.receive(dp);
            //取出数据包中的数据
            String info=new String(dp.getData(),0,dp.getData().length);
            System.out.println("客户端输入 "+info);
            
        //给客户端回应
            String reply="OK";
            byte[] replys=reply.getBytes();
            //获得服务器的端口地址
            SocketAddress ia=dp.getSocketAddress();
            //打包回应数据
            DatagramPacket rp=new DatagramPacket(replys, 0, replys.length,ia);
            //发送数据包
            server.send(rp);
            
            server.close();
        } catch (SocketException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abner G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值