Java网络编程之客户端中的Socket
Socket
Socket是两个主机之间的连接,它有下面7种基本操作:
- 连接到远程主机
- 发送数据
- 接受数据
- 关闭连接
- 绑定端口
- 监听输入数据
- 在绑定的端口上接受远程机器的连接
前面4中操作是客户端和服务端共有的,后面3种只有服务端才需要(定义在ServerSocket类中)。
从Server读取数据
@Testpublic void readFromTimeServer() throws IOException {//不是创建对象,而是建立连接try (Socket socket = new Socket("time.nist.gov",13)){socket.setSoTimeout(15000);//设置超时时间15sInputStream in = socket.getInputStream();StringBuilder time = new StringBuilder();InputStreamReader reader = new InputStreamReader(in,"ASCII");for (int c = reader.read();c!= -1;c=reader.read()){time.append((char)c);}System.out.println(time);}}
设置超时时间是一个很好的习惯。
写数据到Server
@Testpublic void writeToServer() throws IOException {Socket socket = new Socket("dict.org", 2628);socket.setSoTimeout(15000);OutputStream out = socket.getOutputStream();Writer writer = new OutputStreamWriter(out, "UTF-8");writer.write("DEFINE eng-lat gold\r\n");writer.flush();}
构造和连接Socket
基本构造函数
public Socket(String host, int port) throws UnknownHostException, IOException
public Socket(InetAddress host, int port) throws IOException
在构造函数返回之前,一条与远端的网络连接已经被建立完成。
可以利用构造函数的这个特性来检查有效的端口。
String host = "localhost";for (int i = 1; i < 1024; i++) {try {Socket s = new Socket(host, i);System.out.println("There is a server on port " + i + " of "+ host);s.close();} catch (UnknownHostException ex) {System.err.println(ex);break;} catch (IOException ex) {}}
还有3个构造函数创建的是无连接的socket
public Socket()
public Socket(Proxy proxy)
protected Socket(SocketImpl impl)
SocketAddress
SocketAddress代表着连接的终端地址。
SocketAddress可以用来保存IP地址和端口这种信息,可以重用与构造新的Socket。
public SocketAddress getRemoteSocketAddress()
public SocketAddress getLocalSocketAddress()
这两个方法分别用来获取一个连接的远端地址和本地地址。
Socket socket = new Socket("www.yahoo.com", 80);
SocketAddress yahoo = socket.getRemoteSocketAddress();
socket.close();
//Later, you could reconnect to Yahoo! using this address:
Socket socket2 = new Socket();
socket2.connect(yahoo);
获取Socket的相关信息
Socket的下面这几个属性可以通过相应的Get方法获取:
• Remote address
• Remote port
• Local address
• Local port
public InetAddress getInetAddress()
public int getPort()
public InetAddress getLocalAddress()
public int getLocalPort()
但是没有Set方法,因为这些属性会在连接建立成功的时候设置。
getInetAddress()
和getPort()
方法告诉你Socket连接到的远程主机和端口;
getLocalAddress()
和getLocalPort()
方法告诉你Socket连接源端的网卡(network interface)和端口。
与远程端口不同,它通常是“知名端口”,已经由一个标准委员会预先指定;而本地端口通常由系统在运行时从可用的未使用的端口中选择。 这样,同一个系统中多个不同的客户端可以同时访问相同的服务。 本地端口已经和本地主机的IP地址一起嵌入到输出IP数据包,因此服务器可以发送数据到客户端的正确端口。
String [] args = "www.baidu.com,www.qq.com".split(",");for (String host : args) {try {Socket theSocket = new Socket(host, 80);System.out.println("Connected to " + theSocket.getInetAddress()+ " on port " + theSocket.getPort() + " from port "+ theSocket.getLocalPort() + " of "+ theSocket.getLocalAddress());} catch (UnknownHostException ex) {System.err.println("I can't find " + host);} catch (SocketException ex) {System.err.println("Could not connect to " + host);} catch (IOException ex) {System.err.println(ex);}}
打印:
Connected to www.baidu.com/14.215.177.38 on port 80 from port 32416 of /192.168.5.46
Connected to www.qq.com/59.37.96.63 on port 80 from port 32417 of /192.168.5.46
有个方法叫做isConnected()
,它用来判断是否连接过,无法判断现在是否是连接的。如果想判断现在是否是连接状态,可通过下面的代码:
boolean connected = socket.isConnected() && ! socket.isClosed();
Socket中的异常
public class BindException extends SocketException
public class ConnectException extends SocketException
public class NoRouteToHostException extends SocketException
在端口被占用或无访问端口的权限时会抛出BindException;
当客户端尝试连接到远端时,如果远端正忙或者没有监听那个端口,那么会抛出ConnectException;
如果连接超时会抛出NoRouteToHostException;
Java网络编程之客户端中的Socket相关推荐
- 【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )
文章目录 I Socket API 简介 II ServerSocket API 简介 III Socket 数据交互 IV Socket 客户端操作流程 V Socket 服务器端操作流程 VI S ...
- 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )
文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...
- 【Java 网络编程】客户端 Socket 创建
文章目录 I TCP 无代理或无参构造函数 II 创建 Socket 时指定代理 III 创建 Socket 时直接指定服务器地址和端口号 IV 创建 Socket 时直接指定服务器地址和端口号 并绑 ...
- Java网络编程笔记5
在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...
- winsock使用java编写_利用Socket进行Java网络编程(一)
利用Socket进行Java网络编程(一) 考试吧(Exam8.com) 2003-03-04 08:00:00 评论(0)条 作者: 郗旻 Socket是网络上运行的两个程序间双向通讯的一端,它既可 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端
//郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...
- Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例
Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...
- Java网络编程:socket与Netty
Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...
- Java网络编程(Socket、URLConnection)
文章目录 TCP和OSI参考模型 混迹于各层的网络协议 UDP协议 TCP协议 InetAddress类及其常用方法 UDP之DatagramSocket&DatagramPacket TCP ...
最新文章
- matlab decomposition filters,MATLAB小波去噪求助(附算法和显示图片)!不知自己哪个地方出了问题,求指点! - 信息科学 - 小木虫 - 学术 科研 互动社区...
- Javascript进阶:匿名函数详解
- Python 技巧篇-同一个方法多次引用不同效果功能实现,可选参数设置方法
- 算法笔记-两数之和、三数之和、四数之和(LeetCode)
- linux文件删除机制,Linux 文件删除机制
- 人口普查系统_晋江市召开第七次人口普查区域划分及标绘系统操作培训会
- 数学-矩阵计算(4)两种布局
- HDU1213How Many Tables
- 你了解node多进程吗
- 那么多GAN哪个好?谷歌大脑泼来冷水:都和原版差不多 | 论文
- NFC技术:Android中的NFC技术
- 置换矩阵的转置为什么和逆矩阵相等?
- vue-app之H5打开第三方app
- 1.7 F1方程式冠军
- python get rect 函数_Python之Pygame.rect函数
- r710服务器系统故障排除,DELL R710服务器安装windows sever2008 故障排除经历(一)硬件排错...
- 服务器开启防火墙后无法登录系统,客户端连不上,服务器防火墙服务启动不了...
- 8253计数器/定时器实验
- 图片或者其他文件在数据库的存储方式详解
- flow hive 新型蜂箱_流动的蜂蜜盛宴:Flow Hive蜂箱获数百万美元众筹款