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

简介: java实现P2P通信

 先看实现效果:

image.gif编辑

image.gif编辑

核心思想:

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();
        }
    }
}

image.gif

#服务器端

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();
        }
    }
}

image.gif


目录
相关文章
|
9月前
|
网络协议 关系型数据库 应用服务中间件
如何迁移网站数据到新的服务器
迁移网站数据到新服务器是一个系统化的过程,需谨慎操作以避免数据丢失或服务中断。小编为您整理发布如何迁移网站数据到新的服务器,以下是详细步骤和注意事项。
|
12月前
|
缓存 人工智能 架构师
释放数据潜力:利用 MCP 资源让大模型读懂你的服务器
MCP(Model Control Protocol)资源系统是将服务器数据暴露给客户端的核心机制,支持文本和二进制两种类型资源。资源通过唯一URI标识,客户端可通过资源列表或模板发现资源,并使用`resources/read`接口读取内容。MCP还支持资源实时更新通知及订阅机制,确保动态数据的及时性。实现时需遵循最佳实践,如清晰命名、设置MIME类型和缓存策略,同时注重安全性,包括访问控制、路径清理和速率限制等。提供的示例代码展示了如何用JavaScript和Python实现资源支持。
1133 80
|
9月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
868 17
|
8月前
|
存储 安全 数据管理
服务器违规资源被删,数据定时备份OSS 云存储才是 “救命稻草”
在数字化时代,数据已成为企业与个人的核心资产。然而,服务器违规、硬件故障等问题频发,导致数据丢失、业务中断,甚至造成不可挽回的损失。为保障数据安全与业务连续性,定时备份至关重要。阿里云国际站OSS提供高效、可靠的云存储解决方案,支持自动定时备份,帮助用户轻松应对数据风险。本文详解OSS备份操作步骤与注意事项,助你为数据穿上“防护甲”,实现安全无忧存储。
|
10月前
|
弹性计算 安全
阿里云服务器镜像,快速迁移项目数据
有时候旧服务器快到期了,想把项目、数据、软件挪到新服务器上,如果全部重新搭建的话,那无疑是耗时又费力。有了镜像迁移,就方便了许多。
725 1
|
9月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
2278 0
|
9月前
|
安全 Ubuntu Linux
服务器上如何配置FTP远程传输
在服务器上配置FTP(File Transfer Protocol)远程传输,通常涉及安装FTP服务端软件、配置用户权限、设置防火墙规则等步骤。以下是基于Linux系统(以Ubuntu/CentOS为例) 的详细配置指南:
|
11月前
|
存储 数据库 Python
使用HTTP POST协议将本地压缩数据发送到服务器
总的来说,使用HTTP POST协议将本地压缩数据发送到服务器是一个涉及多个步骤的过程,包括创建压缩文件,设置HTTP客户端,发送POST请求,以及服务器端的处理。虽然这个过程可能看起来复杂,但一旦你理解了每个步骤,就会变得相对简单。
389 19
|
11月前
|
弹性计算 NoSQL 数据库
阿里云服务器如何备份数据?
阿里云服务器数据备份有多种方法,用户可按需选择。主要方式包括:1)快照备份,创建云盘的时间点拷贝,支持定期备份与数据恢复;2)数据库备份DBS,适用于多种环境的数据库备份,涵盖本地及多云场景;3)云备份Cloud Backup,提供统一灾备平台,支持ECS整机、数据库、文件系统等全方位备份,保障数据安全。
|
12月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
520 28