13 java里的tcp网络编程

[A-21]ARMv8/v9-SMMU系统架构和功能概述 本文简述了SMMU的系统架构和核心功能 阅读详情

在java里把tcp服务器的功能封装成ServerSocket类,在服务器端通过Socket类对象与连接上来的客户端通信。而且客户端也是使用Socket类对象连接服务器端及通信的.

服务器端:

1 创建一个ServerSocket类对象

        ServerSocket srv = null; //声明ServerSocket指针,用于存放下面创建出来的ServerSocket对象地址
        try {
            srv = new ServerSocket(7788); //创建ServerSocket对象时指定绑定端口号7788
        } catch (IOException e) {  //因端口号可能会发生重用的状况,所以有可能会抛出异常,所以得用try ... catch处理异常
           //   ...
        }

2 调用服务器对象的accept函数成员,等待客户端的连接,每个客户端连接上来会就会得到一个Socket对象,服务器端就用这个Socket对象专用于与客户端的通信使用.

            Socket s; //声明一个Socket指针,用于存放客户端连接上来时得到的Socket对象地址

            s = srv.accept(); //调用此函数会进入堵塞,直到有客户端连接上来.
            // String ip = s.getInetAddress().toString(); //获取s指向的Socket对象的客户端的ip地址
            // int port = s.getPort(); //获取出客户端的端口号

3 当客户端连接上来得到Socket对象地址后,在服务器端就可以通过Socket对象与客户端通信了.

//接收客户端数据
        InputStream in;
        byte [] data = new byte[100];

        in = s.getInputStream(); //获取Socket对象的输入流
        ret = in.read(data); //等待接收数据直到客户端发数据过来为止
        System.out.println(new String(data)); //打印出数据
        in.close(); //关闭输入流


//发数据到客户端
        OutputStream out = s.getOutputStream(); //获取Socket对象的输出流
        out.write("hello world".getBytes()); //通过输出流发数据到客户端
        out.close(); //关闭输出流


客户端:

1 创建一个Socket对象,并指定连接服务器的ip地址及端口号

        Socket s = null; //声明一个Socket指针用于存放创建出来的Socket对象
        try {
            s = new Socket("192.168.250.250", 7788); //创建Socket对象并指定连接服务器的ip地址及端口号
        } catch (Exception e) { //因连接服务器有连接失败的可能,所以需要处理有可能会抛出的异常
            // ...
        }

2 连接成功后就可以获取Socket对象的输入流和输出流,用于与服务器端通信使用了.

//接收服务器端数据
        InputStream in;
        byte [] data = new byte[100];

        in = s.getInputStream(); //获取Socket对象的输入流
        ret = in.read(data); //等待接收数据直到服务器端发数据过来为止
            ...

//发数据到服务器端
        OutputStream out = s.getOutputStream(); //获取Socket对象的输出流
        out.write("hello world".getBytes()); //通过输出流发数据到服务器端
           ...


实现一个简单的tcp通信例子, 客户端连接上服务器端后发出一个字符串,服务器端打印输出接收到的内容:
服务器端代码:

/* Main.java */

import java.io.IOException;
import java.io.InputStream;
import java.net.*;

public class Main {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        ServerSocket srv = null;

        try {
            srv = new ServerSocket(7788);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("bind failed");
            System.exit(0);
        }

        Socket s;
        String ip;
        int port, ret;
        InputStream in;
        byte [] data = new byte[100];
        while (true) {
            s = srv.accept();
            ip = s.getInetAddress().toString();
            port = s.getPort();
            System.out.println("connection from " + ip + " " + port);

            in = s.getInputStream();
            while (true) {
               ret = in.read(data);
               if (ret<= 0)
                   break;
               System.out.println(new String(data));

            }
            s.close();
        }

    }

}

客户端代码:

/* Main.java */

import java.io.IOException;
import java.io.OutputStream;
import java.net.*;

public class Main {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Socket s = null;

        try {
            s = new Socket("192.168.250.250", 7788);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }

        OutputStream out = s.getOutputStream();

        out.write("hello world".getBytes());

        out.close();
        s.close();


    }

}


在tcp网络里,每个客户端只能与服务器端通信,当需要与其它客户端通信时就得依靠服务器端转发才可以。

如实现一个群发的tcp网络服务器,当服务器接收到任意一个客户端的数据时都会转发到所有的客户端去。

因每个客户端连接上来时得到一个Socket对象,多个客户端连接时就会有多个对象,而且数据个数是不确定的,所以用LinkedList容器对象来存放所有客户端连接到得的Socket对象.

而且在通过Socket对象的输入流接收数据会堵塞,为了能同时接收多个客户端的数据,所以每个客户端连接上来时就会一个子线程专用于接收数据使用.

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.Iterator;
import java.util.LinkedList;

class MyThread implements Runnable {
    private Socket s;
    LinkedList clients;
    public MyThread(Socket s, LinkedList clients) {
        this.s = s;
        this.clients = clients; 

        System.out.println("connection from " + s.getInetAddress().toString());
        new Thread(this).start();
    }

    public void run() {
        InputStream in = null;

        try {
            in = s.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        ///////////
        byte [] data = new byte[1500];
        int ret = 0;
        Socket stmp;
        String str;

        while (true) {
            try {
                ret = in.read(data);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (ret <= 0)
                break;

            str = s.getInetAddress().toString() + " :" + s.getPort() + " " + new String(data, 0, ret);
            System.out.println(str);        
            //转发到所有客户端
            Iterator it = clients.iterator();
            while (it.hasNext()) {
                stmp = (Socket) it.next();
                try {
                    System.out.println("write to " + stmp.getInetAddress());
                    stmp.getOutputStream().write(str.getBytes());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
            }
        }
        clients.remove(s);  
        try {
            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        LinkedList clients = new LinkedList();
        ServerSocket srv = new ServerSocket(7788);
        Socket s = null;

        while (true) {
            s = srv.accept();
            if (s.isConnected()) {
                clients.add(s);
                new MyThread(s, clients);
            }
        }


    }

}
用AI+Playwright实现零代码UI自动化测试:以登录页面为例的实战指南 本文详细介绍了如何利用AI与Playwright结合实现零代码UI自动化测试,特别以登录页面为例进行实战演示。通过自然语言描述生成测试脚本,大幅降低技术门槛,提升测试效率,并支持跨浏览器验证。适合非技术人员快速上手专业级自动化测试。 阅读详情

相关推荐

OpenCV+ArUco实战:如何用Python实现高精度二维码测距(附完整代码)

本文详细介绍了如何使用Python和OpenCV实现基于ArUco标签的高精度单目视觉测距。通过相机标定、标签检测和三维位置估算,结合完整代码示例,帮助开发者在机器人导航、工业自动化等场景中实现厘米级距离测量,并探讨了精度优化与三维可视化等进阶应用。

weixin_29052717的博客 474

Java:HttpServer提供轻量级http服务

JDK >= 6 package com.demo.desktop; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAdd

彭世瑜的博客 2586

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2335

【Java 网络编程】TCP 服务器端 客户端 简单示例

I IntelliJ IDEA 创建 Java 项目 II 客户端 Socket 创建 III Socket 客户端连接服务器端 IV Socket 两个端点信息获取 V 控制台人机交互 VI Socket 客户端与服务器端交互 VII ServerSocket 服务器端端口监听 VIII ServerSocket 服务器端参数获取 IX ServerSocket 服务器端同时与多个客户端交互方案 X Socket 客户端代码示例 XI Socket 服务器端代码示例 XII 运行客户

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1704

峰岹FU6832L双核电机控制芯片实战:从FOC算法到BLDC/PMSM驱动开发

在嵌入式系统和电机控制领域,磁场定向控制(FOC)是实现无刷直流电机(BLDC)和永磁同步电机(PMSM)高效、平稳运行的核心算法。其原理是通过坐标变换将三相交流量分解为直流量,实现类似直流电机的转矩与磁场解耦控制,从而提升效率、降低噪音与振动。这项技术的工程价值在于能以更低的处理器开销实现高性能驱动,广泛应用于消费电子、工业自动化与智能家电。本文以峰岹FU6832L芯片为例,深入解析其独特的双核架构——将实时性要求极高的FOC运算交由专用硬件引擎处理,解放主控CPU处理应用逻辑,并结合PID参数整定、电流

weixin_29570795的博客 511

优快云余额充值前必读:这5个隐藏条款,90%的开发者都忽略了(附iOS内购避坑指南)

本文揭示了优快云余额充值中90%开发者忽略的5个隐藏条款,包括不可退款规则、iOS内购限制、账号安全责任等关键内容,特别提供了iOS内购避坑指南,帮助开发者避免资金损失和账号风险。

weixin_26765287的博客 146

java tcp 多线程_Java 多线程ServerSocket通讯简单实例(基于TCP协议)

首先是建立一个类继承Thread类package com.zzq.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io....

weixin_34185396的博客 193

STM32F103C8T6+I2C+DMA读取陀螺仪模块JY901S(硬件I2C

说明:1.本实验代码适用移植一切stm32f1系列;2.本实验使用的是外设资源硬件I2C2;3.本实验运用的是DMA单次模式,如果需要DMA的循环模式,请移步我的另一篇文章;4.本文章不提供陀螺仪校准教学,并是在没有校准陀螺仪情况下读取数据;5.本文章是作者的学习记录及心得,如有不足,欢迎指正。 总结:亲测stm32f103c8t6最小系统板通过片上外设资源I2C配合DMA读去陀螺仪模块jy901s偏航角有效。

anquanyuanqqadsy的博客 6171

java 轻量级 httpserver_HTTP轻量级服务器

如果想开发HTTP服务端不想用容器TOMCAT或者APACHE之类的,那么下面这个绝对是你最佳的选择!package com.lee.java;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java...

weixin_42370434的博客 902

PyCharm与MicroPython联手:打造高效ESP32开发环境

本文详细介绍了如何使用PyCharm与MicroPython打造高效的ESP32开发环境。通过配置PyCharm插件、刷写MicroPython固件以及实战示例,帮助开发者快速上手嵌入式Python开发,显著提升物联网项目的开发效率。

weixin_29169899的博客 380

诊断测试工具CANoe.DiVa从入门到精通系列——开门见山

### 工具主要用于测试ECU的诊断功能。关于自动化诊断测试可以分为如下内容: ### -> 1、根据诊断需求规范进行cdd文件的编辑(现阶段主要是诊断问卷调查表); ### -> 2、新建Diva工程,导入对应的诊断数据库文件生成测试用例; ### -> 3、新建CANoe工程,导入CANoe.DiVa生成的Diva工程; ### -> 4、根据测试报告进行错误处理。

Soly_kun的博客 3546

Java创建TCP服务端工具类

类来处理每个客户端连接。以下是一个简单的TCP服务器工具类的示例,该类可以作为一个起点,用于构建更复杂的服务器应用程序。在Java中,创建一个TCP服务器通常涉及使用。类来监听传入的连接,并使用。

qq_42331393的博客 682

基于 Python + Flask + Echarts 的疫情监控系统

基于 Python + Flask + Echarts 的疫情监控系统

743

Java 网络编程(TCP编程 和 UDP编程)

我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接Socket来进行分离。套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据。而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次工作。Socket实际是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。

weixin_61635597的博客 1738

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java网络编程

Java网络编程 1、网络编程 1.1、概述 1、计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统。网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。 2、Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序。 3、Java提供的网络类库,可以实现无痛的网络连

laizhenghua的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【13章网络编程】鲜为人知的网络编程

【13章网络编程:概述、计算机网络、IP和端口号、网络协议、TCP\IP协议,TCP网络编程,三次握手与四次握手、UDP网络编程,URL编程】

小鳴人的博客 2316

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java-13】网络编程知识整理总结

在网络通信协议下,不同计算机上运行的程序,可以进行数据传输单元测试就是编写测试代码,可以准确、快速地保证程序的正确性,Junit是Java单元测试的框架。@BeforeClass 全局只会执行一次,而且是第一个运行(标记的方法需要是一个静态无参无返回值方法)@Before 在测试方法运行之前运行(非静态无参无返回值方法)**@Test 测试方法(此方法必须是非静态无参无返回值方法), 主要用于测试的方法 **@After 在测试方法运行之后运行(非静态无参无返回值方法)

接着奏乐接着舞的博客 2778

Java网络编程详解

1、网络编程 网络编程          网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习。          在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的。首先来问一个问题:你 会打手机吗?很多人可

逍遥飞鹤的专栏 3万+

【网络编程】简述TCP通信程序,三次握手,四次挥手

TCP(Transmission Control Protocol)是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。在程序员的网络编程中,TCP可以说是使用最频繁的网络协议之一。那么TCP通信程序是如何工作的呢?本文将详细介绍TCP通信的程序示例、三次握手、四次挥手等过程,帮助大家深入理解TCP通信的内在运行机制。TCP通信需要客户端与服务端建立连接后才能相互发送数据。

小吉妙妙屋 1279

【Java SE】13. 网络编程

13. 网络编程13.1 概述13.2 网络通信要素概述13.3 通信要素1:IP与端口号13.4 通信要素2:网络协议13.5 TCP网络编程13.6 UDP网络编程13.7 URL编程 13.1 概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库, 程序员面对的是一个

coolcoolcool 275

Java基础 - 13 - 网络编程

Java基础 - 13 - 网络编程

qq_50755868的博客 952

JavaSE进阶13:网络编程入门、UDP通信程序、TCP通信程序、日志logback、枚举

1.线程池 1.1 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定义在了java.lang.Thread.State枚举类中,State枚举类的源码如下: public class Thread { public enum State { /* 新建 */ NEW , /* 可运行状态

XXXZhy丶Blog 1714

Java网络编程面试题

Java网络编程面试题 1、tcp和udp的区别1 2、tcp连接建立的时候3次握手,断开连接的4次握手的具体过程1 3、什么是同步?什么是异步?2 4、.什么是阻塞?什么是非阻塞?5 5、什么是阻塞IO?什么是非阻塞IO?6 6、...

2253

13. Java网络编程

Java网络编程

Buluchacha的博客 1231

探索Java网络编程精髓:UDP与TCP的实战魔法!

Java 中提供了专门的网络编程程序包 java.net,提供了两种通信协议:UDP(数据报协议)和 TCP(传输控制协议),本文对两种通信协议的开发进行详细介绍。1UDP 介绍UDP:User Datagram Protocol,是一种无连接的传输层协议,是不可靠的消息传输服务。UDP 为应用程序提供了一种无需建立连接就...

cnzzs的博客 1128

Java高级编程——网络编程

Java高级编程——网络编程

qq_61524266的博客 2299
上一篇: Centos7虚拟机系统在windows上搭建
下一篇: 14 java里的udp网络编程
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值