用java套接字socket实现两台电脑间的通信

这篇具有很好参考价值的文章主要介绍了用java套接字socket实现两台电脑间的通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果:

一方发送简单的文字消息

发送、接收复杂的图片、音频、文档等

相互之间实现自由通信


java对网络编程的支持

前提条件:两台电脑在一个局域网内,比如连接了同一个路由器

将一台电脑作为服务端,一台作为客户端


实现中遇到的问题:

ip地址连接不上

发送的消息带有大量byte字节的空白占位符

DatagramPacket方法的重载

端口被占用


简单实现步骤:

服务端开放指定端口->客户端连接端口(需要服务端的ip地址)

客户端将要发送的内容转为流发送->服务端接受流并解析输出


注意事项:

服务端的ip地址是连接上局域网的ipv4地址,比如

用java套接字socket实现两台电脑间的通信

这是需要在命令行里ping一下验证是否能够请求到:

如出现下图字节流,则表示正常能请求到

用java套接字socket实现两台电脑间的通信

如出现下图情况,则要检查ip地址

用java套接字socket实现两台电脑间的通信

端口号必须是空闲的,一般随便输入比如7894、4566、3674、2467都是空闲的,否则编译会报错,改一下就行了。


先简单使用Tcp实现

服务端:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;

        try {
            //1.我的有一个地址
            serverSocket = new ServerSocket(9988);
            //2.等待客户端连接过来
            socket = serverSocket.accept();
            //3.读取客户端的信息
            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);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
                if (is != null) {
                    is.close();
                }
                if (socket != null) {
                    socket.close();
                }
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        InetAddress serverIP=null;
        Socket socket=null;
        OutputStream os=null;

        try{
            //1、要知道服务器地址,端口号
            serverIP=InetAddress.getByName("192.168.0.102");
//如果是本机之间互发就改为localhost或127.0.0.1
            int port=9988;
            //2、创建一个socket连接
              socket=new Socket(serverIP,port);
            //发送消息IO流
            os=socket.getOutputStream();
            os.write("小明在吗?".getBytes());

        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try{
                if (os !=null) {
                    os.close();
                }
                if(socket!=null){
                    socket.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

服务端启动,客户端在启动消息可以从客户端发送到服务端了。


使用Tcp传输图片等信息,客户端发送图片到服务端

服务器端可以向客户端发送接收消息

服务端:

import java.io.*;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//为了简洁清晰,没有采取异常处理模块
public class TcpServer {
    public static void main(String[] args)throws Exception {
        //1.创建服务
        ServerSocket serverSocket=new ServerSocket(1256);
        //2.监听客户端
        Socket socket=serverSocket.accept();
        //3.读取信息
        InputStream is=socket.getInputStream();

        //文件输出新路径
        FileOutputStream fos=new FileOutputStream("src/resources/new/newkonan.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());

        //关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

客户端: 

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args)throws Exception{
        //1.建立连接
        Socket socket=new Socket(InetAddress.getByName("192.0.0.102"),1256);
        //2.建立一个输出流
        OutputStream os=socket.getOutputStream();
        //3.读取文件
        FileInputStream fos=new FileInputStream(new File("src/resources/konan.jpg"));
        //4.写出文件
        byte[] buffer=new byte[1024];
        int len;
        while ((len=fos.read(buffer))!=-1) {
            os.write(buffer,0,len);
        }

        //通知服务器,我已经结束了
        socket.shutdownInput();

        //确定服务器接受完毕,才能够断开连接
        InputStream inputStream=socket.getInputStream();
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1) {
            baos.write(buffer,0,len);
        }
        
        if(baos.toString()=="可以断开了"){
            //5.关闭资源
            fos.close();
            os.close();
            socket.close();
        }
    }
}

使用多线程建立聊天室,实际上使用Udp协议传输

接收端:

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

public class TalkReceive implements Runnable {
    DatagramSocket socket = null;
    private int Port;
    private String msgFrom;

    public TalkReceive(String msgFrom,int port) {
        this.msgFrom=msgFrom;
        this.Port=port;
        try {
            socket = new DatagramSocket(Port);//开放端口
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                //准备接收
                byte[] data=new byte[1024];
                DatagramPacket packet = new DatagramPacket(data, 0, data.length);
                socket.receive(packet);    //接收数据包

                //过滤byte数组中的空白位置
                int k=0;
                for (byte dataum : data) {
                    if (dataum != (byte) 0) {
                        k++;
                    }
                }

                //断开连接
                byte[] datas=packet.getData();
                String receivedata=new String(datas,0,k);

                System.out.println(msgFrom+":"+receivedata);

                if(receivedata.equals("bye")){
                    break;    //监测到结束指令
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

发送端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;

public class TalkSend implements Runnable{
    DatagramSocket socket=null;
    BufferedReader reader =null;

    private String toIP;
    private int toPort;


    public TalkSend(String toIP,int toPort){
        this.toIP=toIP;
        this.toPort=toPort;

        try{
            socket=new DatagramSocket();    //建立套接字
            reader = new BufferedReader(new InputStreamReader(System.in));//从控制台读取数据
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try{
                String data=reader.readLine();
                //将控制台输入的数据转换为byte字节
                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(Exception e){
                    e.printStackTrace();
            }
        }
        socket.close();
    }
}

学生端:

public class TalkStudent {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TalkSend("localhost",5678)).start(); //发送到5678端口
        new Thread(new TalkReceive("老师",8834)).start();    //开放8834端口接收消息
    }
}

老师端:

public class TalkTeacher {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TalkSend("localhost",8834)).start(); //发送消息到8834端口
        new Thread(new TalkReceive("学生",5678)).start();    //开放5678端口接收消息
    }
}

展望:

可以使用网络编程结合前端页面实现通信功能

实现联机游戏

实现聊天群文章来源地址https://www.toymoban.com/news/detail-416775.html

到了这里,关于用java套接字socket实现两台电脑间的通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java网络编程基础:TCP Socket套接字编程 IntAddress UDP等...

    目录 一,网络基础 1.IP地址 2.端口 3.TCP/UDP协议 4.网络编程开发模式  二,基于套接字的Java网络编程 1.Socket  2.InetAddress 三.基于TCP的Socket网络编程 1.单服务器端与单Socket客户端一次通讯 2.单服务器端接收多次通讯  3.TCP网络通讯补充 四,基于UDP的网络编程 1. DatagramSocket:收发

    2024年04月29日
    浏览(46)
  • 【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

    Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ; 在 网络编程 中 , Socket 套接字 主要用于 客户端 与 服务器 之间的 通信 , 大部分 网络相关的应用程序 , 都使用到了 Socket 套接字技术 ; 套接字有两种类型 : 流套接字 : 提供了一个可

    2024年02月15日
    浏览(153)
  • Java网络编程(二)Socket 套接字(TCP和UDP),以及TCP的回显

    我们软件工作者,着重编写的是应用层的代码,但是发送这个数据,我们就需要将应用层传输到传输层,也就意味着我们需要调用应用层的API,统称为 Socket API。 套接字的分类: 流套接字:使用传输层TCP协议 特点: 有连接:使用 TCP 通信的双方,需要时刻保存对方的相关消

    2024年02月09日
    浏览(54)
  • 【Linux网络】网络编程套接字 -- 基于socket实现一个简单UDP网络程序

    我们把数据从A主机发送到B主机,是目的吗?不是,真正通信的不是这两个机器!其实是这两台机器上面的软件(人) 数据有 IP(公网) 标识一台唯一的主机 ,用谁来标识各自主机上客户或者服务进程的唯一性呢? 为了更好的表示一台主机上服务进程的唯一性,我们采用 端口号

    2024年02月12日
    浏览(159)
  • 【socket编程】TCP服务器、UDP服务器、本地套接字【C语言代码实现】

    目录 0. 准备知识 0.1 大小端概念 0.2 网络字节序和主机字节序的转换 0.3 点分十进制串转换(IP地址转换函数) 0.4 IPV4结构体:(man 7 ip) 0.5 IPV6套接字结构体:(man 7 ipv6) 0.6 通用套接字结构体 1. 网络套接字函数 1.1 socket 1.2 connect 1.3 bind 1.4 listen 1.5 accept 1.6 端口复用 2. 包裹函

    2024年02月07日
    浏览(54)
  • 7.1 套接字(socket)

    套接字(socket)是计算机之间进行通信的一种技术,它允许不同主机上的进程之间进行数据交换。在Python中,我们可以使用 socket 模块来创建和使用套接字。 首先,我们需要导入 socket 模块: 在网络编程中,有两种主要类型的套接字:流套接字(Stream Sockets)和数据报套接字

    2024年02月08日
    浏览(84)
  • 「网络编程」第二讲:网络编程socket套接字(三)_ 简单TCP网络通信程序的实现

    「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(二),下面开始讲解!  「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「每篇一句」 I do not know where to go,but I have been on the road. 我不知

    2024年02月11日
    浏览(53)
  • 【网络协议】聊聊套接字socket

    网络编程我们知道是通过socket进行编程的,其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的,所以在设置参数的时候,其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM,而UDP是基于数据报的,设置为SOCK_DGRAM 整体流程其实

    2024年02月07日
    浏览(43)
  • 网络编程套接字(Socket)

    认识IP地址, 端口号, 网络字节序等网络编程中的基本概念; 学习socket api的基本用法; 能够实现一个简单的udp客户端/服务器; 能够实现一个简单的tcp客户端/服务器(单连接版本, 多进程版本, 多线程版本); 理解tcp服务器建立连接, 发送数据, 断开连接的流程; 通俗易懂地说,源

    2024年01月21日
    浏览(58)
  • 【网络编程】socket套接字

    如果我们的台式机或者笔记本没有IP地址就无法上网,而因为每台主机都有IP地址,所以注定了数据从一台主机传输到另一台主机 一定有源IP和目的IP 。 所以在报头中就会包含源IP和目的IP。 而我们把数据从一台主机传递到另一台主机并不是目的,真正通信的其实是应用层上的

    2024年02月02日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包