Better

业精于勤荒于嬉

Java-网络

Better's Avatar 2017-04-10 Java译文

  1. 1. Socket Programming
  2. 2. ServerSocket 类方法
  3. 3. Socket 类方法
  4. 4. Socket编程例子
  5. 5. Socker 服务端例子
  6. 6. 输出

网络编程指的是让所写的代码在几个设备之间运行,为的是将这些设备通过网络彼此相连。
在J2SE下的java.net包中的API,提供了一些低级别的类和接口,帮助你专注于解决手上的问题。
java,net 包提供了两种网络协议:

  1. TCP 传输控制协议,应许你在两个设备之间建立连接。TCP协议广泛使用与网络协议中,被称为TCP/IP.
  2. UDP 用户数据协议,一种无连接协议,允许数据包在应用程序之间传输。
    本文将了解以下两个主题:
  • Socket Programming,网络编程中最广泛使用的概念并且也是解释的最清楚的一部分。
  • URL Processing,将单独讲解,连接

    Socket Programming

    Sockets提供了两个电脑相互通讯的机制。客服端在交流后建立了socket并且尝试去链接服务端。
    当链接建立过后,服务端也在交流后建立的socket。然后客户端和服务端能够通过写和读来通讯。
    java.net.Socket类提供了一个socket,java.net.ServerSocket类提供了服务端监客户端并建立链接的机制。
    以下表示了两台电脑通过tcp建立链接的步骤:
  1. 服务端创建 ServerSocket对象,提供那个端口将用于通讯。
  2. 服务端调用ServerSocket的accept()方法。方法将等待之道客户端链接到刚刚指定的端口。
  3. 在服务端处于等待的时候,客户端创建Socket对象,并指定需要链接的服务端地址以及端口号。
  4. Socket类的构造方法尝试将客服端与所指的服务端以及端口。如果链接建立了,客户端就有用能和服务端通讯的Socket对象。
  5. 在服务端,accept()方法将返回一个可以与客户端链接成功的Socket对象。
    在链接建立成功过后,将通过I/O流的方式进行通讯。每个Socket对象都拥有OutputStream和InputStream。客户端的InputStream链接的是服务端的OutputStream,OutputStream链接的是服务端的InputStream。
    Tcp是双向的通讯协议,意味着可以同时在各自的流之间发送数据。以下是提供完整的实现套接字方法的有用类。

    ServerSocket 类方法

    序号 方法和描述
    1 public ServerSocket(int port) throws IOException 创建ServerSocket对象并绑定指定的端口,如果端口已经被其他的绑定了抛出异常
    2 public ServerSocket(int port, int backlog) throws IOException backlog参数指定了有等待队列将能够存储多少传入客户端
    3 public ServerSocket(int port, int backlog, InetAddress address) throws IOException InetAddress参数指定了绑定的本地的地址,InetAddress用于服务端有多个IP地址,指定某个确定的地址用于客户端的绑定
    4 public ServerSocket() throws IOException 创建一个非绑定的对象,当你需要绑定服务时调用bind()来绑定ServerSocket
    如果ServerSocket的构造方法没有抛出异常,表明你的程序已经成功的绑定了指定的端口,等待客户端的链接。
    ServerSocket的常用方法:
序号 方法和描述
1 public int getLocalPort() 返回服务端监听的端口。这个方法是有用的在你构建的时候传递0作为参数给构造方法,让他自己为你寻找可用的端口。
2 public Socket accept() throws IOException 等待客户端的连入。方法将一直阻塞,知道客户端链接或者等待超时,假设已经过setSoTimeout()方法设置了超时时间。否者方法将永远阻塞
3 public void setSoTimeout(int timeout) 设置服务端等待客户端连入的等待时间
4 public void bind(SocketAddress host, int backlog) 将套接字绑定到SocketAddress对象中指定的服务器和端口。如果您使用无参数构造函数实例化了ServerSocket,请使用此方法。

当ServerSocket的accept()方法调用后,只有客户端链接过后才会返回。在客户端链接过后,ServerSocket在未指定的端口上创建一个新的Socket,并返回对此新Socket的引用。此后TCP链接将在客户端和服务端之间,回话开始。

Socket 类方法

java.net.Socket 类提供了一个可以和服务端进行交流得到Socket对象。客户端通过创建获得一个Socket对象,服务端通过accept()方法获得Socket对象。
Socket有5个构造方法用于去链接服务端。

序号 方法和描述
1 public Socket(String host, int port) throws UnknownHostException, IOException. 尝试根据指定的服务地址和端口链接服务端。如果不抛出异常表示链接服务端成功
2 public Socket(InetAddress host, int port) throws IOException 跟上面的方法一样,只是服务端的地址是InetAddress对象
3 public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 链接指定服务端地址和端口,并在本地的地址和端口创建socket对象
4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 于前一个方法类似,只是服务端的地址是一个InetAddress对象而非String
5 public Socket() 创建一个不立即建立的Socket对象。使用connect()方法链接服务端

构造方法返回的不仅仅只是一个Socket对象,而是一个尝试去链接指定地址和端口的服务端的Socket对象。
Socket类的一些常用方法如下一。注意客服端个服务端都有socket对象,所以一下方法两者都可以调用。

序号 方法和描述
1 public void connect(SocketAddress host, int timeout) throws IOException 链接指定的服务端。改方式仅仅只是在调用Socket的无参构造方法时需要需要
2 public InetAddress getInetAddress() 返回电脑中Socket对象的链接地址
3 public int getPort() 返回Socket对象绑定的远程机上的端口
4 public int getLocalPort() 返回Socket对象绑定的本地上的端口
5 public SocketAddress getRemoteSocketAddress() 返回远程Socket对象地址
6 public InputStream getInputStream() throws IOException 返回Socket的输入流,其实与远程的输出流链接
7 public OutputStream getOutputStream() throws IOException 返回Socket的输出流,其与远程的输入流链接
8 public void close() throws IOException 关闭Socket,是的Socket对象不再能够再次连接到任何服务器
## InetAddress 类方法
这个类表示Internet 协议地址即IP。下面是Socket编程中常用的方法。
序号 方法和描述
1 static InetAddress getByAddress(byte[] addr) 给出给定原始IP地址的InetAddress对象
2 static InetAddress getByAddress(String host, byte[] addr) 根据指定的地址返回InetAddress对象
3 static InetAddress getByName(String host) 确定主机名称的IP地址。
4 String getHostAddress() 以文本形式返回IP地址
5 String getHostName() 返回主机地址
6 static InetAddress InetAddress getLocalHost() 返回本地地址
7 String toString() 返回Ip的String

Socket编程例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

public static void main(String [] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("Connecting to " + serverName + " on port " + port);
Socket client = new Socket(serverName, port);

System.out.println("Just connected to " + client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);

out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);

System.out.println("Server says " + in.readUTF());
client.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}

Socker 服务端例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
private ServerSocket serverSocket;

public GreetingServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}

public void run() {
while(true) {
try {
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();

System.out.println("Just connected to " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());

System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
+ "\nGoodbye!");
server.close();

}catch(SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
}catch(IOException e) {
e.printStackTrace();
break;
}
}
}

public static void main(String [] args) {
int port = Integer.parseInt(args[0]);
try {
Thread t = new GreetingServer(port);
t.start();
}catch(IOException e) {
e.printStackTrace();
}
}
}

输出

1
2
3
4
5
$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!

原文

This article was last updated on days ago, and the information described in the article may have changed.