【JavaSocket编程】实现P2P客户端与服务器端双向传输数据(附代码)

本文详细展示了如何使用Java通过socket实现客户端与服务器端的双向通信,包括建立连接、数据收发和线程处理。客户端与服务器端各自创建进程,通过DataInputStream和DataOutputStream进行数据的发送与接收。
摘要由CSDN通过智能技术生成

先看实现效果:

核心思想:

1使用socket建立连接

2客户端和服务器端分别创建两个进程,通过soccket来进行数据的发送和接收

话不多说,直接上代码

#客户端

package test;
import java.io.*;
import java.net.*;
import java.util.*;
public class TestClient {
    public static void main(String[] args) {
        try {//建立一个socket进行通信
            Socket socket=new Socket("localhost",8001);
            System.out.println("开启客户端");
            Thread thread1=new Thread(){//线程1重写run函数,用于接受数据
                @Override
                public void run(){
                    try {
                        InputStream i1=socket.getInputStream();
                        DataInputStream in1=new DataInputStream(i1);
                        while(true)//建立封装输入流,随后用true不断读取数据
                        {
                            String s1=in1.readUTF();
                            System.out.println("客户端:我收到的数据是:"+s1);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
            Thread thread2=new Thread()
            {//建立封装输出,随后使用true不断进行输出
                @Override
                public void run(){
                    try {
                        OutputStream o1=socket.getOutputStream();
                        DataOutputStream out1=new DataOutputStream(o1);
                        Scanner sca1=new Scanner(System.in);
                        while(true)
                        {
                            String s3=sca1.next();
                            out1.writeUTF(s3);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            };
            thread1.start();
            thread2.start();
            try {
                thread1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("客户端关闭了");
            socket.close();
        } catch (IOException e) {
            System.out.println("断开连接");
            e.printStackTrace();
        }

    }
}

#服务器端

package test;
import java.io.*;
import java.net.*;
import java.util.*;
public class TestServer {
    public static void main(String[] args) {
        //1建立连接
        try {
           ServerSocket serverSocket = new ServerSocket(8001);
            System.out.println("开启服务端");
            Socket s =serverSocket.accept();//等待建立连接
            System.out.println("有连接过来了"+s);
            Thread thread1=new Thread(){//线程1收入数据
                @Override
                public void run(){
                    try {
                        InputStream i1=s.getInputStream();
                        DataInputStream in1=new DataInputStream(i1);
                        while(true)//建立封装输入流,随后用true不断读取数据
                        {
                            String s1=in1.readUTF();
                            System.out.println("服务端:我收到的数据是:"+s1);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
            Thread thread2=new Thread()
            {//建立封装输出,随后使用true不断输出
                @Override
                public void run(){
                    try {
                        OutputStream o1=s.getOutputStream();
                        DataOutputStream out1=new DataOutputStream(o1);
                        Scanner sca1=new Scanner(System.in);
                        while(true)
                        {
                            String s3=sca1.next();
                            out1.writeUTF(s3);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            };
            thread1.start();
            thread2.start();
            try {
                thread1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("客户端关闭了");
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java Socket编程可以实现文件传输功能,具体实现步骤如下: 1. 创建服务器Socket对象并监听指定端口号,等待客户端连接。 2. 客户端创建Socket对象并连接服务器,连接成功后可以通过Socket对象获取输入输出流。 3. 服务器接受到客户端的连接后,可以通过ServerSocket对象的accept方法获取到与客户端通信的Socket对象,通过该对象获取输入输出流。 4. 通过输入输出流进行文件传输。客户端从本地读取文件并通过输出流写入到服务器,服务器从输入流读取文件并保存到本地。 以下是一个简单的Java Socket编程实现文件传输功能的代码示例: 服务端: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8888); System.out.println("服务端启动成功,等待客户端连接..."); Socket socket = server.accept(); System.out.println("客户端已连接,IP地址为:" + socket.getInetAddress().getHostAddress()); InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream("D:\\temp\\test.txt"); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } System.out.println("文件传输完成"); fos.close(); is.close(); socket.close(); server.close(); } } ``` 客户端: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 8888); OutputStream os = socket.getOutputStream(); FileInputStream fis = new FileInputStream("D:\\temp\\test.txt"); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { os.write(buffer, 0, len); } System.out.println("文件传输完成"); fis.close(); os.close(); socket.close(); } } ``` 相关问题: 1. Java Socket编程有哪些应用场景? 2. 如何处理Java Socket编程中可能出现的异常? 3. Socket和ServerSocket的区别是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北村南

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

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

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

打赏作者

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

抵扣说明:

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

余额充值