java基于TCP的socket编程简单实现[代码实践过]

Android 基于TCP的 Socket 编程实现(结合 okio) 两个进程如果要进行通讯最基本的一个前提就是能够唯一的标识一个进程,在本地进程通讯中我们可以使用 PID 来唯一标识一个进程,但 PID 只在本地是唯一的,网络中两个进程 PID 冲突几率很大,这时我们就需要通过其他手段来唯一标识网络中的进程了,我们知道 IP 层的 ip 地址可以唯一标示主机,而 TCP 层协议和端口号结合就可以唯一标示主机的一个进程了。 阅读详情

1.什么是socket

  所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

  以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器 端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来 说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过 SocketImpl类及其子类完成的。

  重要的Socket API:

  java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。

  . Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

  . getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。

  . getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

  注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

  2.如何开发一个Server-Client模型的程序

  开发原理:

  服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

  客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

多个客户同时连接:
主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。

现在实现服务器端编程:(基于TCP方式)
MyServer .java
---------------------------------------------------
package server;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//这个简单的socket服务器端主要是说句Hello XXX,采用多线程实现
public class MyServer extends Thread {

private Socket s;

public static void main(String[] args) {
     MyServer.server();//main入口,一运行机器,就开通server服务。
}

public MyServer(Socket s) {
     this.s = s;
}

public void run() {
     try {
      OutputStream os = s.getOutputStream();
      InputStream is=s.getInputStream();
      byte[] bu=new byte[20];
      int len=is.read(bu);//从客户端读取消息
      String userName=new String(bu,0,len);
      Date d=new Date();
      System.out.println(userName+" is coming here at "+d.toLocaleString());//写在服务器端控制台的日志显示
      String welcome="hello,"+userName+"!";
      //System.out.println(welcome);
      os.write(welcome.getBytes());//返回给客户端的欢迎信息
      os.close();
      is.close();
      s.close();
     } catch (Exception e) {
      e.printStackTrace();
     }
}

public static void server() {
     try {
      ServerSocket ss = new ServerSocket(9527); //服务器的套接字,端口为9527
      while (true) {
       Socket s = ss.accept();
       new MyServer(s).start(); //用户一进来就运行一个线程
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
}
}


客户端编程:
MyClient .java
---------------------------------
package client;

import java.io.*;
import java.net.*;

public class MyClient {

public static void main(String[] args) {
     //这里先强迫用户输入用户名,调用client(str)方法。
     String str = "";
     try {
      while (str.length() < 1) {
       System.out.println("请输入您的名字");
       str = new DataInputStream(new BufferedInputStream(System.in))
         .readLine();
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
     MyClient.client(str);
}

public static void client(String userName) {
     try {
      Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 9527);//套接字的IP地址和端口号
      OutputStream os = s.getOutputStream();
      InputStream is = s.getInputStream();
      byte[] Name = userName.getBytes("ISO-8859-1"); //这个是为了中文乱码问题
      os.write(Name);//向服务器发送消息
      byte[] serverSay = new byte[100];
      int len = is.read(serverSay);//接受服务器消息
      System.out.println(new String(serverSay, 0, len));//客户端控制台显示服务器返回的信息
      is.close();
      os.close();
      s.close();//记住一定要关闭这些输入,输出流和套接字
     } catch (Exception e) {
      e.printStackTrace();
     }

}
}

用Java实现基于Socket的网络编程 使用Java语言,采用TCP协议,实现一对一、一对多的通信(无用户界面) 阅读详情

相关推荐

基于TCP的Socket编程

     TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。在使用TCP协议传输数据,接收端收到的是一个和发送端完全一样的数据流。发送端和接收端必须建立联系,以便在TCP协议基础上进行通讯,其端口之间建立连接,一...

qq_41141896的博客 6731

java检测文件句柄泄露_tcp socket文件句柄泄漏

今天发现有台redis机器上出现socket个数告警,这是很奇怪的现象。因为一台redis服务器上就部署了几个redis实例,打开的端口应该是有限。1、netstat显示的tcp连接数正常netstat-n|awk'/^tcp/{++state[$NF]}END{for(keyinstate)printkey,"\t",state[key]}'TIME_WAIT...

weixin_42512183的博客 809

【Java TCP/IP Socket】Socket编程大合集

为了方便各位网友学习以及方便自己复习之用,将Java TCP/IP Socket编程系列内容按照学习顺序总结如下: 【Java TCP/IP Socket】Java TCP Socket程编程 【Java TCP/IP Socket】Java UDP Socket编程 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析 【Java TCP/IP Socket】构建和解析自定义协议消息 【Java TCP/IP Socket】基于线程池的TCP服务器 【Java TCP/IP

兰亭风雨的专栏 1万+

Java 基于 TCP 的 Socket 编程

服务器端会主动监听某个指定的端口,客户端必须主动连接服务器的 IP 地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个 TCP 连接,双方后续就可以随时发送和接收数据。TCP 协议,指传输控制协议(TCP,Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。注意:服务端需要先于客户端启动,否则客户端因连接不到指定的进程而报错。实际场景中,一个服务端往往可以支持多个客户端的连接,为多个客户端提供服务。

swadian2008的博客 4495

Java 网络编程 ②-TCP Socket

对于 TCP协议 来说,需要先处理和客户端发来的连接,通过读写 clientSocket,与客户端进行通信,如果没有客户端发起连接,那么就会阻塞在 accept,这里的阻塞和多线程的阻塞又本质区别。如果只是一个线程处理连接和读取请求两个工作,由于服务端线程会在 hasNext() 那里阻塞,就不能处理下一个客户端的连接了,所以。,这里的主线程处理与客户端的连接,连接到一个客户端后,就创建一个线程来处理客户端发送来的请求。在写入时,并不是直接写入到网卡的,而是写入到缓冲区,故在写完时,若一直没有读到请求,

Themberfue的博客 1419

30、JAVA进阶——Socket编程

一、Socket知识 1. Socket概述 2. Socket通信原理 3. java.net包 二、基于TCP协议的Socket编程 1.Socket类和ServerSocket类 2.使用Socket编程实现登录功能 三、基于UDP协议的Socket编程 1.DatagramPacket类和DatagramSocket类 2.使用Socket编程实现客户咨询

不迁怒,不贰过。小知识,大智慧。 2万+

JAVA--基于TCP协议的Socket编程

(1)java.net包的两个类Socket和ServerSocket,分别用来实现双向安全连接的客户端和服务器端

不会飞的小飞侠24 4360

VisionPro 9.0 QuickBuild里用C#脚本调用Halcon 23.11模型,保姆级图文配置流程

本文详细介绍了如何在VisionPro 9.0 QuickBuild环境中使用C#脚本调用Halcon 23.11深度学习模型,提供从环境配置到模型集成的保姆级图文教程。重点解决图像格式转换、许可证配置等工业视觉检测中的常见问题,帮助开发者快速实现高效、稳定的视觉检测流水线部署。

weixin_27027459的博客 432

Java TCP Socket编程

一、TCP Socket 参考:《Java

Xiaoting's blog 1033

基于STM32的HC-SR04超声波模块测距(新手级)

本人是嵌入式新手,学习了STM32的部分内容,最近想找些项目做,然后顺便学习了一下HC-SR04超声波模块,学习过程中也参考了一些大佬的文章。本文记录了自己的学习方法和学习过程,同时也希望能和各位大佬交流讨论。

weixin_63758495的博客 2204

ICG setup timing violation介绍?

门控时钟(clock gating)在RTL级电路设计过程中进行低功耗优化常用方法,能够有效降低动态功耗(翻转功耗)。Clock gating cell 可以由与门,与非门,或门或者或非门构成,但很容易产生Glitch。在实际使用中,一般用ICG(集成门控时钟单元)来完成clock gating。 下图展示了glitch的产生原因 在CTS时钟树综合的时候,ICG不会被看作sink,通常放置在source点附近,因此就会出现如上图这种结果。上图可以看出,在分析DFF到ICG的setup timing

m0_61003348的博客 9803

Java中的Socket编程详解

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来深入探讨Java中的Socket编程,这是一种基于网络的通信技术,能够实现不同主机之间的数据传输。在Java中,Socket是网络编程的基础,它提供了两种通信机制:基于流的传输(TCP协议)和基于数据报的传输(UDP协议)。在这段代码中,服务器端通过ServerSocket监听8080端口,一旦有客户端连接进来,就创建一个新的Socket与客户端通信,通过输入流和输出流来接收和发送数据。

聚娃科技开发者博客 1263

主动式桥梁防船撞预警系统的方案汇总

本系统以精密光电测高前端(2台,上下游各1台)、固态雷达(2台,上下游各1台)、AIS(1台)、偏航辅助前端(4台,上下游各2台)为核心,通过人工智能,对画面上的船舶目标进行深度学习、精确定位,再用系统集成方法将各设备有机结合在一起,构建成套的桥梁防撞主动预警系统,全天候监控过往船舶。主动式桥梁防船撞预警系统主要船舶监测采集单元、控制单元、船舶超高、偏航信息检测单元、以及视频监控单元组成,,通过声光警示、短信文字、船舶身份识别及海事对讲频道、视频录像取证等多种手段与船舶进行信息互动,主动防止船舶碰撞桥梁!

gdxixun的博客 971

JAVA 通过 Socket 实现 TCP 编程

简介 所谓socket 通常也称作"**套接字**",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常**通过"套接字"向网络发出请求或者应答网络请求**。 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。**ServerSocket用于服务器端,Socket是建立网络连接时使用的**。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成

王者之峰 12万+

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 231

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1261

基于TCP协议网络socket编程(java实现C/S通信)

本篇是详细记录在TCP通信原理之上,使用Java实现TCP的Socket网络通信,包含C/S软件架构的程序设计,偏向实践,更加有趣!TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

陆海潘江的博客 1万+

Oracle EBS R12.2.X JSP部署、编译和配置相关操作。

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 背景 在某项目上,需要开发JSP相关程序,比如单点登陆、打印二维条码。当前把JSP部署编译以后,访问提示错误:Requested resource or page is not allowed in this site, 通过查SR发现Oracle EBS R12.2.X版本对客制化JSP进行权限控限,需要设置某些配置文件。 实例操作步骤 上传JSP文件 通常上传到$OA_HTML目录或其子目

陈显平的专栏-Oracle EBS 1910

【Java TCP/IP Socket】TCP Socket(含代码)

协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议、TCP协议和UDP协议。     Java为TCP协议提供了两个类:Socket类和ServerSocket类。一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP

兰亭风雨的专栏 7万+

从入门到精通:LabVIEW全攻略

本文为 LabVIEW 全攻略指南,系统梳理从基础到高级的核心知识与应用技巧。首先介绍 LabVIEW 的图形化编程特性、数据流运行机制及开发环境,通过创建与调试 VI 的实操演示帮助入门。接着深入解析程序结构(循环、分支、顺序)、数据类型(数组、簇、波形)及图形显示技术(Graph、XY Graph 等)的原理与应用场景。高级部分涵盖多线程编程、错误处理、硬件通信及第三方工具集成等进阶技术,并针对程序逻辑、硬件适配、性能优化等常见问题提供排查与解决方案。

邓邓子的博客 3573

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java——TCP UDP Socket编程

基础网络知识,Java——TCP UDP Socket编程

m0_62946761的博客 6721

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JAVA—socket编程

socket编程,是在不同的进程间进行网络通讯的一种协议,在socket编程中基于TCP、UDP等协议做的一层封装,是一套系统所提供的的用于进行网络通信的编程接口。

皮皮治不痞痞 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java网络编程之通过代码实现Socket通信

概述 Socket类 构造方法 成员方法 ServerSocket类 构造方法 成员方法 简单的TCP网络程序 TCP通信分析图解 客户端向服务器发送数据 服务器向客户端回写数据

write less , do more 9332

java网络编程:8、基于TCP的socket编程(一)简单的socket通信_一个客户端

一、基于tcp的编程,就好像用电话进行交谈一样 二、在java中用于编程网络程序的类 三、套接字 + (输出、输入流) 1、服务器程序编写基本步骤: 2、客户端程序编写基本步骤: 四、代码编写 1、服务器端程序的编写 2、客户端程序的编写 3、打印输出 4、你这个sever和client都是在同一个程序当中编写的, 那么我如何在两台机器之间进行通信呢? 五、系列文章(java网络编程)

鲁迷那的专栏—坚持实践后再写出来! 3114

Java Socket编程之TCP协议

1、概述 网络编程,又称为Socket编程,简单来讲就是通讯的两个端点都是Socket服务,而Socket服务之间的数据传输本质上都是IO流。而因为网络模型网络层中不同的传输协议,主要指TCP与UDP协议,导致不同的编程的方式。 Java为它们提供的API实现也是不同的类,但是它们都属于Socket编程的一种,所以都遵循Socket编程的基本规范。 2、TCP协议的特性。 虽然关于

Noodles的博客 4050

java实现socket网络编程

1、网络编程原理: 网络编程两大步骤 一、如何定位网络上的一台或者多台主机: 网络层主要负责网路主机的定位,数据传输传输的路由,由ip地址可以唯一的确定internet上的一台主机。 二、如何在定位之后进行数据的传输; 在传输层则提供面向应用的可靠(TCP)或者非可靠(UDP)的数据传输机制 对于客户端/服务器(C/S)结构。 即通信双方一方作为服务器等待客户提出请求并予以响应。 客户则在需要服务...

未的博客 4380
上一篇: java基于UDP的socket通信
下一篇: 多播
jackoo
博客等级 码龄18年 5粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值