`

Java Socket 学习笔记

 
阅读更多

Socket:英文中的意思是插座。

两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。

Java中所有关于网络编程的类都位于java.net包。

一、TCP的socket编程

TCP编程需要使用的两个类:Socket类与ServerSocket类,

分别用来实现双向连接的Client端和Server端。

说明:这里仅指TCP连接。因为UDP中没有Client和Server的概念。UDP只负责发送,不管是否发生成功。

 

建立连接时所需要的寻址信息为远程计算机的IP地址和端口号。

说明:

1.一个端口号只能被一个应用程序占用。

2.1024以下的端口号都由系统使用。普通应用程序不应该去占用。

3.比较有名的应用程序占用某个特定的端口号,一般也不该去占用。

    如HTTP端口,80端口。

        FTP,21端口。

        SMTP,25端口。

        接受邮件,110端口。

 

说明:TCP端口与UDP端口是两个不同的概念。TCP端口有65535个端口,UDP端口也有65536个端口。TCP的8888端口与UDP的8888端口是两个不同的概念。

 

ServerSocket的构造函数

ServerSocket()

ServerSocket(int port)

创建非绑定服务器套接字。

创建绑定到特定端口的服务器套接字。

ServerSocket常用API

Socket accept()  侦听并接受到此套接字的连接。该方法为阻塞方法,当没有接收到新的网络连接前是不会继续执行的。 

 

 

Socket的构造函数

Socket()

Socket(String host, int port)

若没建立连接会抛出异常。

 

 

 

 

例程

例:TCP的Server端

 

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

public class TCPServer {
    public static void main(String[] args) throws Exception {
	ServerSocket ss = new ServerSocket(6666); //建立监听
	while(true) {
		Socket s = ss.accept();//等待请求。若请求,则创建Socket,即建立连接。
System.out.println("a client connect!");
                //输入流
		DataInputStream dis = new DataInputStream(s.getInputStream());
		System.out.println(dis.readUTF());//从流中读出信息。
		dis.close();//关闭流。
		s.close();//关闭socket。
	}
    }
}

 

 

例:TCP的Client端

 

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

public class TCPClient {
    public static void main(String[] args) throws Exception {
	Socket s = new Socket("127.0.0.1", 6666); //建立Socket,寻址,申请连接。
	OutputStream os = s.getOutputStream(); //使用流做通信。输出流
	DataOutputStream dos = new DataOutputStream(os);
	Thread.sleep(30000);
	dos.writeUTF("hello server!");//以UTF-8的编码将数据写入流。
	dos.flush();    //压出流中所有信息。
	dos.close();    //关闭流。
	s.close();      //关闭socket。
    }
}

 

 

说明:

1. 网络应用程序的编程过程中,应该先启动Server再启动Client。而编程过程是Server与Client是同时编写的。

2. ServerSocket类的accept()方法是阻塞式的方法,即若没有接受到连接,则停止在该方法,不再继续执行。

3. 在例程中readUTF()方法也是阻塞式的方法。

4. Client端的端口是系统自动选择的,我们不需要去关注。

 

 

例程的缺点

1. 由于Server端的readUTF()方法是阻塞式的。Server需要等待Client发送数据才会继续执行,所以将会导致accept()方法无法执行。

2. 由于readUTF方法是阻塞方式的。所以如果read()和write()方法是在同一个处理过程中,必须是一段是先读后写,另一端是先写后读。若两个都是先后后写,则Server端和Client都不会继续执行。

 

 

 

 InetAddress:IP地址的超集。除了IP地址。还可以表示其他通信协议的地址。

 

 

 

 

二、UDP编程

UDP是不可靠的。UDP是基于数据报的形式发送数据。(TCP也本质也以数据报发送,但安全性强。)

对与UDP没有Server与Client的概念。

UDP编程中最重要的两个类:DatagramPacket与DatagramSocket

DatagramPacket类:

DatagramSocket类:

 

例程:

例:UDP的Server端

 

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

public class TestUDPServer
{
    public static void main(String args[]) throws Exception
    {
	byte buf[] = new byte[1024];
        //创建数据报。
	DatagramPacket dp = new DatagramPacket(buf, buf.length);  //该数据报与字节数组关联。
	DatagramSocket ds = new DatagramSocket(5678);    //占用5678端口。
	while(true)
	{
	    ds.receive(dp);//接受数据报。并把数据报传递至dp。即数据报中的数据存入buf。
	    ByteArrayInputStream bais = new ByteArrayInputStream(buf);  //从字节数组(源)接上读取流。
	    DataInputStream dis = new DataInputStream(bais);  //用Data流包装读取流。
	    System.out.println(dis.readLong());  //从Data流中读取数据。
        }
    }
}
 

 

 

例:TCP的Client端

 

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

public class TestUDPClient
{
    public static void main(String args[]) throws Exception
    {
        //首先将一个long数,装为字节数组。
	long n = 10000L;
	ByteArrayOutputStream baos = new ByteArrayOutputStream();  //创建写入内存的流(字节数组流)。该流用于向内存写数据。
	DataOutputStream dos = new DataOutputStream(baos);    //用数据流包装内存流。
	dos.writeLong(n);        //向数据流中写入long数。数据流负责把任何类型的数据写到内存流。通过内存流数据写到内存中。
	byte[] buf = baos.toByteArray(); //从内存流(字节数组流)中得到long数的byte数组。

        //创建数据报。
	DatagramPacket dp = new DatagramPacket(buf,
                                               buf.length,
                                               new InetSocketAddress("127.0.0.1", 5678)
                                               );
	DatagramSocket ds = new DatagramSocket(9999);  //占用9999端口。
	ds.send(dp);    //发送数据报。
	ds.close();     //关闭通信socket。
		
    }
}
 

 

 

说明:

DatagramSocket类的receive()方法阻塞式的方法。

InetAddress类继承了SocketAddress类。

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    win7修复本地系统工具

    win7修复本地系统工具

    《自动化专业英语》04-Automatic-Detection-Block(自动检测模块).ppt

    《自动化专业英语》04-Automatic-Detection-Block(自动检测模块).ppt

    《计算机专业英语》chapter12-Intelligent-Transportation.ppt

    《计算机专业英语》chapter12-Intelligent-Transportation.ppt

    西门子S7-1200博图平台下3轴伺服螺丝机程序解析与应用

    内容概要:本文详细介绍了基于西门子S7-1200博图平台的3轴伺服螺丝机程序。该程序使用SCL语言编写,结合KTP700组态和TIA V14及以上版本,实现了对X、Y、Z三个轴的精密控制。文章首先概述了程序的整体架构,强调了其在自动化控制领域的高参考价值。接着深入探讨了关键代码片段,如轴初始化、运动控制以及主程序的设计思路。此外,还展示了如何通过KTP700组态实现人机交互,并分享了一些实用的操作技巧和技术细节,如状态机设计、HMI交互、异常处理等。 适用人群:从事自动化控制系统开发的技术人员,尤其是对西门子PLC编程感兴趣的工程师。 使用场景及目标:适用于希望深入了解西门子S7-1200博图平台及其SCL语言编程特点的学习者;旨在帮助读者掌握3轴伺服系统的具体实现方法,提高实际项目中的编程能力。 其他说明:文中提供的代码示例和设计理念不仅有助于理解和学习,还能直接应用于类似的实际工程项目中。

    MATLAB仿真:非线性滤波器在水下长基线定位(LBL)系统的应用与比较

    内容概要:本文详细探讨了五种非线性滤波器(卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波(PF)和变维卡尔曼滤波(VDKF))在水下长基线定位(LBL)系统中的应用。通过对每种滤波器的具体实现进行MATLAB代码展示,分析了它们在不同条件下的优缺点。例如,KF适用于线性系统但在非线性环境中失效;EKF通过雅可比矩阵线性化处理非线性问题,但在剧烈机动时表现不佳;UKF利用sigma点处理非线性,精度较高但计算量大;PF采用蒙特卡罗方法,鲁棒性强但计算耗时;VDKF能够动态调整状态维度,适合信标数量变化的场景。 适合人群:从事水下机器人(AUV)导航研究的技术人员、研究生以及对非线性滤波感兴趣的科研工作者。 使用场景及目标:①理解各种非线性滤波器的工作原理及其在水下定位中的具体应用;②评估不同滤波器在特定条件下的性能,以便为实际项目选择合适的滤波器;③掌握MATLAB实现非线性滤波器的方法和技术。 其他说明:文中提供了详细的MATLAB代码片段,帮助读者更好地理解和实现这些滤波器。此外,还讨论了数值稳定性问题和一些实用技巧,如Cholesky分解失败的处理方法。

    VMware-workstation-full-14.1.3-9474260

    VMware-workstation-full-14.1.3-9474260

    DeepSeek系列-提示词工程和落地场景.pdf

    DeepSeek系列-提示词工程和落地场景.pdf

    javaSE阶段面试题

    javaSE阶段面试题

    《综合布线施工技术》第5章-综合布线工程测试.ppt

    《综合布线施工技术》第5章-综合布线工程测试.ppt

    安川机器人NX100使用说明书.pdf

    安川机器人NX100使用说明书.pdf

    S7-1200 PLC改造M7120平面磨床电气控制系统:IO分配、梯形图设计及组态画面实现

    内容概要:本文详细介绍了将M7120型平面磨床的传统继电器控制系统升级为基于西门子S7-1200 PLC的自动化控制系统的过程。主要内容涵盖IO分配、梯形图设计和组态画面实现。通过合理的IO分配,确保了系统的可靠性和可维护性;梯形图设计实现了主控制逻辑、砂轮升降控制和报警逻辑等功能;组态画面则提供了友好的人机交互界面,便于操作和监控。此次改造显著提高了设备的自动化水平、运行效率和可靠性,降低了维护成本。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和控制系统设计的专业人士。 使用场景及目标:适用于需要进行老旧设备升级改造的企业,旨在提高生产设备的自动化水平和可靠性,降低故障率和维护成本。具体应用场景包括但不限于金属加工行业中的平面磨床等设备的控制系统改造。 其他说明:文中还分享了一些实际调试中的经验和技巧,如急停逻辑的设计、信号抖动的处理方法等,有助于读者在类似项目中借鉴和应用。

    chromedriver-linux64-136.0.7103.48.zip

    chromedriver-linux64-136.0.7103.48.zip

    IMG_20250421_180507.jpg

    IMG_20250421_180507.jpg

    《网络营销策划实务》项目一-网络营销策划认知.ppt

    《网络营销策划实务》项目一-网络营销策划认知.ppt

    Lianantech_Security-Vulnerabil_1744433229.zip

    Lianantech_Security-Vulnerabil_1744433229

    MybatisCodeHelperNew2019.1-2023.1-3.4.1.zip

    MybatisCodeHelperNew2019.1-2023.1-3.4.1

    《Approaching(Almost)any machine learning problem》中文版第13章(最后一章)

    【深度学习部署】基于Docker的BERT模型训练与API服务部署:实现代码复用与模型共享

    火车票订票系统设计与实现(代码+数据库+LW)

    摘  要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装火车票订票系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,火车票订票系统的有效运用可以帮助管理人员准确快速地处理信息。 火车票订票系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为Eclipse,选择的数据库工具为Mysql。以此搭建开发环境实现火车票订票系统的功能。其中管理员管理用户,新闻公告。 火车票订票系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,火车票订票系统都可以轻松应对。 关键词:火车票订票系统;SpringBoot框架,系统分析,数据库设计

    【ABB机器人】-00标准保养简介.pdf

    【ABB机器人】-00标准保养简介.pdf

    最新校园跑腿小程序源码 多校版本 多模块 适合跑腿 外卖 表白 二手 快递等校园服务.zip

    最新校园跑腿小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务 此版本为独立版本,不需要微擎 直接放入就可以 需要自己准备好后台的服务器,已认证的小程序,备案的域名!

Global site tag (gtag.js) - Google Analytics