Java中的Socket

java.net包中提供了两种常见的网络协议的支持:

  • TCP:TCP传输控制协议,保证了两个应用程序之间的可靠传输通信
  • UDP:UDP是用户数据报协议,一个无链接的协议,提供了应用程序之间要发送的数据的数据包。

    Socket 的定义

    套接字使用TCP提供了两台计算机之间的通信机制。

计算机使用套接字进行通信的过程

  1. 服务器实例化一个ServerSocket对象,表示通过服务器上的端口通信
  2. 服务器调用ServerSocket类的accept()方法,该方法会一直等待,直到客户端连接到服务器上的给定的端口。
  3. 服务器正在等待的时候,一个客户端实例化一个Socket对象,指定服务器名称以及端口来请求连接。
  4. Socket类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个Socket对象与服务器进行通信。
  5. 在服务器端,accept()方法返回服务器上的一个新的socket引用,这个socket连接到客户端的socket。
  6. 连接建立之后,通过使用I/O流进行通信,每一个socket都有一个输出流和一个输入流。客户端的输出流连接到服务器的输入流,客户端的输入流连接到服务器的输出流。
    TCP是一个双向的通信协议,数据可以通过两个数据流在同一个时间发送。

    Socket方法

    参见识 java API

使用Socket实现文件的传输

Server

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package Test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.*;

public class Server extends Thread {
private ServerSocket serverSocket;
public Server(int port) throws IOException {
serverSocket = new ServerSocket(port);
//指定超时 以毫秒为单位
serverSocket.setSoTimeout(10000000);
}
public void run() {
while (true) {
System.out.println("waiting for client on port..."+serverSocket.getLocalPort());
try {
//等待新的连接
Socket server = serverSocket.accept();
System.out.println("Just connected to "+server.getRemoteSocketAddress());
//获取输入流
DataInputStream in = new DataInputStream(server.getInputStream());
File file = new File("/Users/gorge/Desktop"+server.getRemoteSocketAddress()+".txt");
FileOutputStream outputStream =new FileOutputStream(file);
byte car [] = new byte[1024];
int len = 0;
while ((len=in.read(car))!=-1) {
outputStream.write(car, 0, len);
}
outputStream.flush();
//System.out.println("Client say"+in.readUTF());

//DataOutputStream out = new DataOutputStream(server.getOutputStream());
//写入数据 返回这个套接字绑定的端点的地址
//out.writeUTF("Thanks you for a connecting to"+server.getLocalSocketAddress()+"good bye");
server.close();
} catch (SocketException s) {
// TODO Auto-generated catch block
System.out.println("socket timed out");
break;
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
}
public static void main(String[] args) {
int port = 5000;
Thread thread;
try {
thread = new Server(port);
thread.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

Client

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
48
49
50
51
52
53
54
55
在这里package Test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client extends Thread {
int port ;
String servername;
Socket client;
public Client(String servername, int port) {
this.servername = servername;
this.port = port;
try {
System.out.println("Connecting to "+servername+"on port"+port);
client = new Socket(servername,port);
System.out.println("Just connect to "+client.getRemoteSocketAddress());
//输出流
OutputStream outToserver = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToserver);
File file1 = new File("/Users/gorge/Desktop/a.txt");
//先从本地读取一个文件
FileInputStream inputStream = new FileInputStream(file1);
byte [] b = new byte[1024];
int len =0;
while(-1!=(len=inputStream.read(b))) {
out.write(b,0,len);
}
//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 (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Client cl = new Client("127.0.0.1", 5000);
cl.start();
}

}