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相关推荐

  1. 【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )

    文章目录 I Socket API 简介 II ServerSocket API 简介 III Socket 数据交互 IV Socket 客户端操作流程 V Socket 服务器端操作流程 VI S ...

  2. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

  3. 【Java 网络编程】客户端 Socket 创建

    文章目录 I TCP 无代理或无参构造函数 II 创建 Socket 时指定代理 III 创建 Socket 时直接指定服务器地址和端口号 IV 创建 Socket 时直接指定服务器地址和端口号 并绑 ...

  4. Java网络编程笔记5

    在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...

  5. winsock使用java编写_利用Socket进行Java网络编程(一)

    利用Socket进行Java网络编程(一) 考试吧(Exam8.com) 2003-03-04 08:00:00 评论(0)条 作者: 郗旻 Socket是网络上运行的两个程序间双向通讯的一端,它既可 ...

  6. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  7. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  8. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  9. Java网络编程:socket与Netty

    Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...

  10. Java网络编程(Socket、URLConnection)

    文章目录 TCP和OSI参考模型 混迹于各层的网络协议 UDP协议 TCP协议 InetAddress类及其常用方法 UDP之DatagramSocket&DatagramPacket TCP ...

最新文章

  1. matlab decomposition filters,MATLAB小波去噪求助(附算法和显示图片)!不知自己哪个地方出了问题,求指点! - 信息科学 - 小木虫 - 学术 科研 互动社区...
  2. Javascript进阶:匿名函数详解
  3. Python 技巧篇-同一个方法多次引用不同效果功能实现,可选参数设置方法
  4. 算法笔记-两数之和、三数之和、四数之和(LeetCode)
  5. linux文件删除机制,Linux 文件删除机制
  6. 人口普查系统_晋江市召开第七次人口普查区域划分及标绘系统操作培训会
  7. 数学-矩阵计算(4)两种布局
  8. HDU1213How Many Tables
  9. 你了解node多进程吗
  10. 那么多GAN哪个好?谷歌大脑泼来冷水:都和原版差不多 | 论文
  11. NFC技术:Android中的NFC技术
  12. 置换矩阵的转置为什么和逆矩阵相等?
  13. vue-app之H5打开第三方app
  14. 1.7 F1方程式冠军
  15. python get rect 函数_Python之Pygame.rect函数
  16. r710服务器系统故障排除,DELL R710服务器安装windows sever2008 故障排除经历(一)硬件排错...
  17. 服务器开启防火墙后无法登录系统,客户端连不上,服务器防火墙服务启动不了...
  18. 8253计数器/定时器实验
  19. 图片或者其他文件在数据库的存储方式详解
  20. flow hive 新型蜂箱_流动的蜂蜜盛宴:Flow Hive蜂箱获数百万美元众筹款

热门文章

  1. 从零开始的全栈工程师——html篇1.4
  2. POJ1088(dp)
  3. 内容分发网络CDN(互联网技术)
  4. Search in Rotated Sorted Array leetcode java
  5. 饥饿的时候我想起的小食
  6. python图片二值化提高识别率
  7. Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
  8. webpack + react
  9. 前端------Codepen 用起来非常舒服的工具
  10. 关于AngularJS: