如何使用Java完成Socket通信

 更新时间:2023年09月28日 17:00:51   作者:牛言牛语  
这篇文章主要介绍了如何使用Java完成Socket通信问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用Java完成Socket通信

用Java实现一个最基本的Socket_TCP编程

可以放在一个项目中,创建两个Java文件

注意:

  • 先运行服务器端(SocketTCP_Server类)
  • 再运行客户端(SocketTCP_Client类)
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
    服务器端
 */
public class SocketTCP_Server {
    public static void main(String[] args) throws Exception {
        //思路
        //1. 在本机 的9999端口监听, 等待连接
        //   细节: 要求在本机没有其它服务在监听9999
        //   细节:这个 ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器段,监听9999端口,等待连接");
        //2. 当没有客户端连接9999端口时,程序会 阻塞, 等待连接
        //   如果有客户端连接,则会返回Socket对象,程序继续
        Socket socket = serverSocket.accept();
        System.out.println("服务器端 socket = " + socket.getClass());
        //3. 通过socket.getInputStream() 读取客户端写入到数据通道的数据, 显示
        InputStream inputStream = socket.getInputStream();
        //4. IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;
        while ((readLine = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, readLine));
        }
        //5.关闭IO流和socket
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
 * 客户端
 */
public class SocketTCP_Client {
    public static void main(String[] args) throws Exception {
        //1. 连接服务端 (ip , 端口)
        //解读:连接本机的 9999端口, 如果连接成功,返回Socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket = " + socket.getClass());
        //2. 连接上后,生成Socket, 通过socket.getOutputStream()
        //得到和 socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
        //3. 通过输出流,写入数据到 数据通道
        outputStream.write("Hello,server".getBytes());
        //4. 关闭流对象和socket, 必须关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出...");
    }
}

Java socket通信,用于各种无线网络通信

无论是使用Wi-Fi模块在单片机和电脑或手机之间进行数据传输,基本方法都是:

一台设备建立服务端,一台设备作为客户端连接,连接成功后即可进行通信。

服务端的建立

Java中建立服务端,不局限于电脑才能建立,一台手机同样可以建立:

    /**
     * 建立服务端
     *
     * @param sp 建立服务端的通信端口
     */
    private static void StartServer(int sp) {
        try {
            serverSocket = new ServerSocket(sp);   //服务端使用ServerSocket建立
            System.out.println("Server started at:" + InetAddress.getLocalHost());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        new Thread(){
            @Override
            public void run() {
                while (SERVER_ENABLE) { //循环监听
                    try {
                        s = serverSocket.accept(); //在有客户端连入之前,while循环将一直卡在这里
                        new MasterServerThread(s).start(); //客户端连接成功后,开启一个自定义的服务器线程
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

服务线程  

    /**
     * 服务器主线程
     */
    private static class MasterServerThread extends Thread {
        Socket masterSocket = null; //传入的客户端Socket
        String socketKind = null;
        //构造方法,在实例化本Class时要求传入客户端的socket
        public MasterServerThread(Socket s) {
            this.masterSocket = s;
        }
        @Override
        public void run() {
            BufferedReader bre = null;
            try {
                bre = new BufferedReader(new InputStreamReader(masterSocket.getInputStream(), "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while ((socketKind = bre.readLine()) != null) { //接收读取传输过来的数据 
                    //根据发过来的数据是什么,决定进行指定操作        
                     if (socketKind.contains(LOGIN_REQUEST)) {//TODO 处理登陆请求操作
                           //......
                     } else if (socketKind.contains(OPERATION_OF_BINDING_DEVICE)) {//TODO 处理设备绑定
                           //......
                     }                 
                }
            } catch (Exception e) {
                //e.printStackTrace();
            }
        }
    }

客户端的连接

/**
*    SERVER_IP : String型
*  SERVER_PORT :int型
*/
Socket socket = new Socket(SERVER_IP, SERVER_PORT); //服务端用的ServerSocket,客户端对应的是使用Socket
ClientThread ct = new ClientThread(socket);  //同样开启客户端线程,与服务器通信用
ct.start();
 

客户端线程

    /**
     * Class : ClientThread
     * 与服务端线程class十分相像
     */
    private class ClientThread extends Thread {
        Socket cSocket;
        BufferedReader br;
        public ClientThread(Socket s) {
            this.cSocket = s;
        }
        @Override
        public void run() {
            try {
                br = new BufferedReader(new InputStreamReader(cSocket.getInputStream(), "UTF-8"));
                while ((temp = br.readLine()) != null) {
                    //Do Something...
                   }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

发送消息

 /**
     * 发送登陆信息
     * @param id 用户ID
     * @param pwd 账号密码
     */
    private void sendLoginMsg(final String id, final String pwd) {
        new Thread() {
            @Override
            public void run() {
                try {
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                    printWriter.println(LOGIN_REQUEST + "CONNECTION_FROM_APP" + "_" + id + "$" + pwd + "&");
                    printWriter.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 实现简单圣诞树的示例代码(圣诞节快乐)

    java 实现简单圣诞树的示例代码(圣诞节快乐)

    这篇文章主要介绍了java 实现简单圣诞树的示例代码(圣诞节快乐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java中synchronized锁升级的过程

    Java中synchronized锁升级的过程

    本文主要介绍了Java中synchronized锁升级的过程,synchronized相对于早期的synchronized做出了优化,从以前的加锁就是重量级锁优化成了有一个锁升级的过,下文详细内容需要的小伙伴可以参考一下
    2022-05-05
  • Maven仓库无用文件和文件夹清理的方法实现

    Maven仓库无用文件和文件夹清理的方法实现

    这篇文章主要介绍了Maven仓库无用文件和文件夹清理的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详解Spring Boot中Controller用法

    详解Spring Boot中Controller用法

    Controller是SpringBoot里最基本的组件,他的作用是把用户提交来的请求通过对URL的匹配,分配个不同的接收器,再进行处理,然后向用户返回结果。下面通过本文给大家介绍Spring Boot中Controller用法,需要的朋友参考下
    2017-05-05
  • idea2025中git的local changes找不到了的问题分析及解决方案

    idea2025中git的local changes找不到了的问题分析及解决方案

    在IDEA 2025中,LocalChanges视图迁移至Advanced Settings下的VersionControl.Git设置,若未显示,需检查是否启用GitHub插件,并在相应选项中勾选启用,本文给大家介绍idea2025中git的local changes找不到了的问题,感兴趣的朋友一起看看吧
    2025-07-07
  • logback的UNDEFINED_PROPERTY属性源码执行流程解读

    logback的UNDEFINED_PROPERTY属性源码执行流程解读

    这篇文章主要为大家介绍了logback的UNDEFINED_PROPERTY属性源码执行流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • maven依赖关系中的<scope>provided</scope>使用详解

    maven依赖关系中的<scope>provided</scope>使用详解

    这篇文章主要介绍了maven依赖关系中的<scope>provided</scope>使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringBoot 利用MultipartFile上传本地图片生成图片链接的实现方法

    SpringBoot 利用MultipartFile上传本地图片生成图片链接的实现方法

    这篇文章主要介绍了SpringBoot 利用MultipartFile上传本地图片生成图片链接的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java实现优酷视频地址解析示例代码分享

    java实现优酷视频地址解析示例代码分享

    最近做了一个在线视频的下载器,需要解析youku的视频,获得真正的视频地址,现在把解析过程记录下来以供参考
    2014-01-01
  • Spring中基于Java的配置@Configuration和@Bean用法详解

    Spring中基于Java的配置@Configuration和@Bean用法详解

    这篇文章主要介绍了Spring中基于Java的配置@Configuration和@Bean用法详解,Spring中为了减少xml中配置,可以声明一个配置类(例如SpringConfig)来对bean进行配置。,需要的朋友可以参考下
    2019-06-06

最新评论