Socket接口用法详解

 

在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求。

扩展:

ServerSocket中常用的构造函数及方法

构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

方法:

Socket accept() 产生阻塞,监听指定的端口,直至有客户端发来连接请求

void close() 关闭当前ServerSocket

InetAddress getInetAddress() 返回ServerSocket监听的,本机的IP地址

int getLocalPort() 返回ServerSocket监听的,本机的IP地址上指定的端口号

int getSoTimeout();void setSoTimeout(int timeout) 设置连接过程中没有得到相应的等待期限时间(TimeOut)

String toString()   以字符串的方式返回ServerSocket监听的,本机的IP地址及其端口号

Socket类中常用的构造函数和方法

构造函数:Socket(InetAddress address,int port) 用于创建一个链接,向指定的IP地址上指定的端口的服务器端程序发送连接请求

Socket(String host,int port)   同上,但该方法允许通过主机名字符串向服务器发送连接请求

方法:

void close()关闭当前的Socket 连接

InetAddress getInetAddress() 返回Socket建立了连接的服务器的IP地址

InputStream getInputStream() 返回当前Socket的输入流

OutputStream getOutStream() 返回当前Socket的输出流

InetAddress getLocalAddress() 返回和Socket进行连接的本地的IP地址

int getLocalPort() 返回和Socket进行连接的本地的端口号

int getPort() 返回和Socket建立了连接的服务器的端口号

int getSoTimeOut();void setSoTimeOut(int timeout) 设置连接过程中没有得到相应的等待期限时间

String toString () 以字符串的方式返回Socket的属性信息

Socket类的构造方法包括以下几种:

public Socket(String host,int port)

public Socket(InetAddress address,int port)

public Socket(String host,int port,InetAddress localAddr,int localPort)

public Socket(InetAddress host,int port, InetAddress,localAddr,int localPort)

在JDK1.1以前,Socket类可同时用于TCP/UDP通信:

public Socket(String host,int port,Boolean stream)

public Socket(InetAddress host,int port, Boolean stream)

Socket类的输入/输出流管理包括以下方法:

public InputStream getInputStream()

public void shutdowmInput()

public OutputStream get OutputStream ()

public void shutdowmOutput()

以上这些方法都将抛出IOException异常,程序中需要捕获并处理。

关闭Socket的方法为:

public void close() throws IOException

设置/获取Socket数据的方法为:

public InetAddress getInetAddress()

public int getPort()

public void setSoTimeout(int timeout)

这些方法都将抛出SocketException异常,程序中需要捕获并处理。

ServerSocket类的构造方法包括以下几种:

public ServerSocket (intPort)

public ServerSocket (int Port,int backlog):支持指定数目的连接

public ServerSocket (intPort,int backlog,InetAddress bindAddr)

这些方法都将抛出IOException异常,程序中需要捕获并处理。

public Socket  accept():等待客户端的连接

public void close():关闭Socket

设置/获取Socket数据的方法包括:

public InetAddress  get InetAddress ()

public int getLocalPort()

public void setSoTimeout(int timeout)

这些方法都将抛出SocketException异常,程序中需要捕获并处理。

Socket的基本概念

1.建立连接

当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求。这一点同电话系统类似——必须有一方拨打电话,而另一方必须等候电话连通。建立连接的过程为:

(1)现在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求。

(2)当客户端需要连接时,相应地要生成一个Socket实例对象,并发出连接请求,其中host参数指明该主机名,port#参数指明该主机端口号。

(3)服务器端通过accept()方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流。

(4)客户端和服务器端的通信都是通过一对InputStream和OutputStream进行的,通信结束后,两端分别关闭对应的Socket接口。

2.连接地址

打电话时,呼叫方必须事先知道所需拨打的号码,而程序建立网络连接时,也同样需要知道地址或主机名称。另外,网络连接还需要一个端口号(可以将其当作电话的分机号),连接到正确的主机之后,需要对该连接确认特定口令。某些情况下,还需要使用一个扩展号码与网络计费系统相连,于是相应地要有一个特定端口号用于连接计费程序。

3.端口号

在TCP/IP系统中,端口号由16位二进制整数组成,即在0-65535之间。实际应用中,前1024个端口号已经预先定义为一些特定服务,因此一般不能使用,除非想同这些服务器进行连接(如Telnet,SMTP,mail,ftp等)。在两个程序连接之前,彼此之间必须达成一致,即由客户端负责初始化连接,而服务器随时等候请求。只有客户端和服务器端指定端口号一致时连接才会建立。如果系统中两个程序所用端口号不一致,这连接无法建立。

4.网络连接模式

在Java中,TCP/IP接口的连接是由java.net包中的类实现的。如图表示的是Socket连接过程中客户端和服务器端的工作原理。

每个server端都拥有一个端口号,一台机器上如果运行多个服务,这可能对应多个端口号。通信结束后,两端分别关闭对应的Socket接口,而不影响其他的端口。

Socket通信的基本步骤

使用Socket方式进行网络通信的程序基本结构都是类似的,无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的。客户端与服务器端进行通信的过程都包括以下四个基本步骤:

(1)在服务器端指定一个用来等待连接的端口号,在客户端规定一个主机和端口号,从而在客户端和服务器端创建Socket/ServerSocket实例。

(2)打开连接到Socket的输入输出流。

(3)利用输入输出流,按照一定的协议对Socket进行读写操作。

(4)关闭输入输出流和Socket

通常,程序员的主要工作时针对所要完成的功能砸器第(3)步进行编程,第(1)、(2)、(4)步对所有的通信程序来说几乎都是一样的。

Socker通信的程序设计

1.服务器端程序

TCP/IP服务器端应用程序是通过Java语言中提供的ServerSocket和Socket这两个有关网络的类来实现的。而ServerSocket类除了建立一个Server之外,还通过accept()方法提供了随时监听客户端连接请求的功能,它的构造方法有以下两种。

ServerSocket(int port)

ServerSocket(int port,int backlog)

其中port是指连接中对方的端口号,backlog则表示服务器端所能支持的最大连接数。下面的程序用来监听客户端应用程序建立连接的请求,并在连接建立后向客户端发送信息。

/**

* 功能:这是服务器端程序,用来监听客户端应用程序建立连接的请求,并在连接建立后向客户端发送信息

*/

package com.xushouwei;

//引入相应的包

import java.net.*;

import java.io.*;

public class TServer

{

public static void main(String[] args)

{

//定义ServerSocket类

ServerSocket s=null;

//定义Socket类

Socket s1;

//定义发送字符串

String sendString="你好!我是徐守威...";

//得到发送字符串的长度

int s1lenth=sendString.length();

//定义OutputStream类

OutputStream s1out;

//定义DataOutputStream类

DataOutputStream dos;

//通过1314端口建立连接

try

{

//创建ServerSocket并把传入端口号

s=new ServerSocket(1314);

} catch (Exception e)

{

e.printStackTrace();

}

//循环运行监听程序,以监视连接请求

while(true)

{

try

{

//监听端口请求,等待连接

s1=s.accept();

//得到与socket相连接的数据流对象

s1out=s1.getOutputStream();

dos=new DataOutputStream(s1out);

//发送字符串

dos.writeUTF(sendString);

//关闭数据流(但不是关闭Socket连接)

dos.close();

s1out.close();

s1.close();

} catch (Exception e)

{

e.printStackTrace();

}

}

}

}

2.客户端程序

TCP/IP服务器端应用程序是通过Java语言中提供的Socket类来实现的。同样,Socket类提供了包括建立网络连接在内的许多功能,它的构造方法有以下几种:

Socket(InetAddress address,int port)

Socket(InetAddress address,int port,Boolean stream)

Socket(String host,int port)

Socket(String host,int port, InetAddress localAddr,int localPort)

其中,address、host和port分别指连接另一方的IP地址、主机名称和端口号,stream这表示该Socket是否是支持流的Socket,localAddr和localPort是本机的地址和端口号。下面程序用来与前面的服务器端程序建立连接,并将服务器端送来的信息显示在标准输出上。

/**

* 功能:这是客户端程序,用来与前面的服务器端程序建立连接,并将服务器端送来的信息显示在标准输出上

*/

package com.xushouwei;

//引入相应的包

import java.net.*;

import java.io.*;

public class TClint

{

public static void main(String[] args)

{

//定义Socket类

Socket s1;

//定义InputStream类

InputStream s1In;

//定义DataInputStream类

DataInputStream dis;

try

{

//在端口1314打开连接

s1=new Socket("127.0.0.1",1314);

//获得socket端口的输入句柄,并从中读取数据

s1In=s1.getInputStream();

dis=new DataInputStream(s1In);

String st=new String(dis.readUTF());

System.out.println(st);

//操作结束,关闭数据流及socket连接

dis.close();

s1In.close();

s1.close();

} catch (Exception e)

{

e.printStackTrace();

}

}

}

Java语言Socket接口用法详解的更多相关文章

  1. java.util.ResourceBundle国际化用法详解

    java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...

  2. Java之函数式接口@FunctionalInterface详解(附源码)

    Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...

  3. java中synchronized的用法详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  4. Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...

  5. Java 中 synchronized的用法详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之 ...

  6. [转]Java中Map的用法详解

    转载地址:http://www.zhixing123.cn/jsp/30113.html Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictio ...

  7. Java enum(枚举)的用法详解(转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  8. Java中Map的用法详解

    Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collecti ...

  9. java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

随机推荐

  1. 让shell 变得容易理解

    1.重建你的语义模型(简单语义模型)2.变量,参数和方法命名3.测试用例4.足够的组块

  2. 绑定网关mac,防arp攻击

    netsh i i show innetsh -c i i add neighbors 16 192.168.1.1 08-57-00-51-19-7c

  3. ARM系统中函数调用过程中的参数传递-转

    在 嵌入式软件编程中,经常会用到函数调用,之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0传递第一个参数,R1传递到第 二个..一直到R3传递第四个参数.但是实际上有时可 ...

  4. (转)MultipleOutputFormat和MultipleOutputs

    MultipleOutputFormat和MultipleOutputs http://www.cnblogs.com/liangzh/archive/2012/05/22/2512264.html ...

  5. java中的序列化流和反序列化流

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...

  6. ecstore中kvstore之memcached

    memcached的安装 详细见 http://blog.csdn.net/motian06/article/details/17558831 memcached扩展的安装 详细见 http://bl ...

  7. ApexSql Log

    网址:https://www.apexsql.com/,可免费试用14天   安装成功后,点击new,配置DB连接:   选择要分析的Log文件:   进行过滤设置:     基本设置:时间,DML和 ...

  8. (中等) HDU 4069 Squiggly Sudoku , DLX+精确覆盖。

    Description Today we play a squiggly sudoku, The objective is to fill a 9*9 grid with digits so that ...

  9. 关于Discuz与jQuery冲突问题的亲测解决方法

    最近的一个项目整合dede和discuz程序,客户要求风格统一,所以有很多样式及特效都是要公用的.其中jQuery库定义的函数$()正好与discuz的comme.js中函数一样,这样就冲突了,导致d ...

  10. OPENCV图像变换-1

    图像变换是指将一幅图像变换为图像数据的另一种表现形式,例如将图像进行傅立叶变换,或者对图像进行X,Y方向的求导等,经过这些变换,可以将图像数据处理中的某些问题换一个别的角度想办法,所以图像变换是图像处 ...