Socket类

套接字是网络连接的端点,套接字使应用可以从网络中读取数据,可以向网络中写入数据。不同计算机上的两个应用程序可以通过连接发送或接收字节流,以此达到相互通信的目的。

为了从一个应用程序向另一个应用程序发送消息,需要知道另一个应用程序中套接字的 IP 地址和端口号,在java中,套接字由java.net.Socket 表示。

要创建一个套接字,可以使用Socket类中众多构造函数中的一个。其中一个构造函数接收两个参数:主机号和端口号。

public Socket (String host, int port)

其中参数host是远程主机的名称或IP地址,参数port是连接远程应用程序的端口号,例如,想要通过80端口连接yahoo.com,可以使用如下语句创建Socket对象

new Socket ("yahoo.com", 80);

一旦成功创建了Socket类的实例,就可以使用该实例发送或接收字节流,要发送字节流,需要调用Socket类的getOutputStream() 方法获取一个java.io.OutputStream对象,

要发送文本到远程应用程序,通常需要使用返回的OutputStream对象创建一个java.io.PrintWriter对象。若想要从连接的另一端接收字节流,需要调用Socket类的getInputStream()

方法,该方法会返回一个java.io.InputStream对象。

  下面的代码创建了一个套接字,用于与本地Http服务器进行通信,发送HTTP请求,接收服务器的相应信息,以下代码创建了一个StringBuffer对象来保存信息,并输出。

Socket socket = new Socket("127.0.0.1", "8080");
OutputStream os = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out = new PrintWriter(
socket.getOutputStream(), autoflush); BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//send an HTTP request to the web server
out.println("GET /index.jsp HTTP/1.1");
out.println("Host: localhost:8080");
out.println("Connection Close");
out.println(); //read the response
boolean loop = true;
StringBuffer sb = new StringBuffer(8096);
while (loop) {
if (in.ready()) {
int i = 0;
while (i != -1){
i = in.read();
sb.append((char) i);
}
loop = flase;
}
Thread.currentThread().sleep(50);
}
System.out.println(sb.toString());
socket.close();

ServerSocket类

Socket类表示一个客户端套接字,即,当想要连接远程服务器应用程序时创建的套接字。但如果你想要实现一个服务器应用程序(例如一个HTTP服务器或FTP服务器),

你需要另一种方法,因为服务器必须时刻待命,它并不知道客户端应用程序会在什么时候发起连接,正因为如此,需要使用java.net.ServerSocket类。这是服务器套接字的实现。

ServerSocket类和Socket类并不相同,服务器套接字要等待来自客户端的连接请求,当服务器套接字收到了连接请求后,它会创建一个Socket实例来处理与客户端的通信。

要创建一个服务器套接字,可以使用ServerSocket类提供的4个构造函数中的任意一个,需要指明IP地址和服务器套接字侦听的端口号,典型情况下,IP地址可以为127.0.0.1,

即服务器套接字会侦听本地机器接收到的连接请求,服务器套接字侦听的IP地址称为绑定地址。服务器套接字的另一个重要属性是backlog,后者表示在服务器拒绝接收传入的

请求之前,传入的连接请求的最大队列长度。

   ServerSocket类的其中一个构造函数的签名如下:

public ServerSocket (int port, int backLog, InetAddress bindingAddress);

值得注意的是,在这个构造函数中,参数绑定地址必须是java.net.InetAddress类的实例。创建InetAddress对象的一种简单方法是调用其静态方法getByName(),

传入包含主机名的字符串,代码如下所示:

InetAddress.getByName("127.0.0.1");

下面的一行代码创建了一个ServerSocket对象,ServerSocket对象侦听本地主机的8080端口,其backlog值为1;

new ServerSocket(8080, 1, InetAddress.getByName("127.0.01"));

创建了ServerSocket实例后,可以使其等待传入的连接请求,该连接请求会通过服务器套接字侦听的端口上绑定地址传入,这些工作可以通过调通ServerSocket类的accept方法

完成。只有当接收到连接请求后,该方法才会返回,其返回值是一个Socket实例,然后,就可以如上所述使用该Socket对象与客户端应用程序进行字节流的发送/接收。

Socket类 以及 ServerSocket类 讲解的更多相关文章

  1. socket系列之服务器端socket——ServerSocket类

    一般地,Socket可分为TCP套接字和UDP套接字,再进一步,还可以被分为服务器端套接字跟客户端套接字.这节我们先关注TCP套接字的服务器端socket,Java中ServerSocket类与之相对 ...

  2. java网络编程ServerSocket类 和Socket类的常用构造方法及其方法

    Socket类Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号.Socket(String host, int po ...

  3. 关于Socket和ServerSocket类详解

    Socket类 套接字是网络连接的一个端点.套接字使得一个应用可以从网络中读取和写入数据.放在两个不同计算机上的两个应用可以通过连接发送和接受字节流.为了从你的应用发送一条信息到另一个应用,你需要知道 ...

  4. 用java的socket来发送一个类

    用socket可以简单的发送一些文本信息,太复杂的可能发送不了,比如图片音频可能要用到http来发送和接收了.最基本的使用socket来发送一个字符串,但有的时候我们希望能够发送一个类,这样serve ...

  5. java socket之传输实体类对象

    一.TCP编程     TCP协议是面向连接的.可靠地.有序的,以字节流的方式发送数据.java实现TCP通信依靠2个类:客户端的Socket类和服务器端的ServerSocket类. 基于TCP通信 ...

  6. 网络编程基础——System.Net.Socket 命名空间及相关类的使用

    System.Net.Socket 命名空间主要提供制作 Socket 网络应用程序的相关类.(Socket 类.TcpClient 类.TcpListener 类 和 UdpClient 类) 1. ...

  7. python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)

    s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  8. 05-- C++ 类的静态成员详细讲解

     C++ 类的静态成员详细讲解    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不 ...

  9. php面向对象:类的继承实例讲解

    什么是类的继承?说白了,我觉得就是提高代码使用效率的.下面我就给大家介绍下继承.大理石平台维修 类的继承概念 子类继承父类的所有成员变量个方法,包括构造方法,当子类被实例化时,php会现在子类中查询构 ...

随机推荐

  1. php Yii2 报错unexpected '}'

    报错unexpected '}'一般是缺少":"导致的

  2. ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击

    什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...

  3. ReactNative环境搭建扩展篇——安装后报错解决方案

    之前一篇写了<逻辑性最强的React Native环境搭建与调试>说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以下简称RN),这一篇重点来说 ...

  4. zoj3785 What day is that day?

    It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are multiple tes ...

  5. Linux入门练习

    1.echo是用于终端打印的基本命令: 1.1echo默认将一个换行符追加到输出文本的尾部. 1.2 echo中转义换行符 如需使用转义序列,则采用echo -e "包含转义序列的字符串&q ...

  6. linux ls 命令

    ls 命令是 Linux 下最常用的命令之一,用来查询目录下的内容(list directory contents).本文将介绍其基本的用法和一些典型的用例.笔者使用的测试环境为 ubuntu 16. ...

  7. exjs上传图片异常:com.jspsmart.upload.SmartUploadException: File can't be saved (1120).

    错误: 文件名格式不对:未命??.jpg SmartUpload mySmartUpload = new SmartUpload(); com.jspsmart.upload.File myFile ...

  8. 分布式定时任务 -- elastic-job

    一.前言 在我们的项目当中,使用定时任务是避免不了的,我们在部署定时任务时,通常只部署一台机器.部署多台机器时,同一个任务会执行多次.比如短信提醒,每天定时的给用户下发短信,如果部署了多台,同一个用户 ...

  9. CountDownLatch和CyclicBarrier 特点比较

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp79   并发编程中的CountDownLatch和CyclicBarri ...

  10. C语言中指针*p[N], (*P)[N],及**p的区别

    在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...