Java 网络编程
Socket(套接字)
前言:
套接字使用TCP提供了两台计算机之间的通信机制。客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket对象的写入和读取来进行通信。java.net.Socket类代表一个套接字,并且java.net.ServerSocket类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
-
服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
-
服务器调用 ServerSocket 类的 accept()方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
-
服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
-
Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
-
在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
-
连接建立后,通过使用 I/O流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
以上借鉴于菜鸟编程
C/S模式下,一个服务器对应多个客户端请求。客户端通过一个Socket对象绑定服务器的IP地址和端口号,并且通过Socket对象中getInputStream()方法和getOutputStream()与客户端进行读写。
代码1.0:
简单信息交互
客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class C {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 7777);
/*创建套接字,并确定服务器的IP地址为127.0.0.1(本机地址) 端口号为7777*/
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
/*在套接字类中确定is输入流,os输出流*/
os.write("hello server".getBytes());
/*利用os对客户端输出一句话*/
byte[] bt = new byte[1024];
int len = is.read(bt);
System.out.println(new String(bt,0,len));
/*创建一个数组,并通过is把从服务器端获取的信息存入数组并输出*/
socket.close();
/*最后结束套接字连接*/
}
}
服务器端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class S {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7777);
/*创建服务器的套接字,并确定对外服务的端口号*/
Socket accept = serverSocket.accept();
/*侦听并接受到此套接字的连接,通过此方法与连接此服务器的客户端进行交互*/
InputStream is = accept.getInputStream();
OutputStream os = accept.getOutputStream();
/*通过is,os进行交互,*/
byte[] bt = new byte[1024];
int len = is.read(bt);
System.out.println(new String(bt,0,len));
/*接受客户端发送的信息,并输出*/
os.write("hello client".getBytes());
/*对客户端进行输出*/
accept.close();
serverSocket.close();
/*关闭套接字和服务端器*/
}
}
代码2.0:
简单文件交互
客户端
import java.io.*;
import java.net.Socket;
public class CN {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\1.txt");
/*创建文件输入流*/
Socket socket = new Socket("127.0.0.1", 7777);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
/*与信息交互功能一致*/
byte[] bt = new byte[1024];
int len = 0;
while ( (len = fis.read(bt)) != -1 ){
os.write(bt,0,len);
}
/*创建一个数组,先通过文件输出流中的read方法,把需要传输给服务器的文档存入一个数组*/
/*并通过套接字的方法把该字节部分输出给服务器*/
socket.shutdownOutput();
/*禁用此套接字的输出,把之前所有在流的信息push给服务器,并关闭输出流*/
while ( (len = is.read(bt)) != -1){
System.out.println(new String(bt,0,len));
}
/*通过is方法读取信息,并输入该信息*/
fis.close();
socket.close();
/*关闭文件流和套接字*/
}
}
服务器
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SN {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7777);
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
OutputStream os = accept.getOutputStream();
int len = 0;
byte[] bt = new byte[1024];
/*与信息交互功能一致*/
File file = new File("D:\\test");
/*创建文件路径*/
if ( !file.exists() ){
file.mkdirs();
}
/*判断该文件路径是否存在,若不存在,创建该文件*/
FileOutputStream fos = new FileOutputStream(file + "\\1.txt");
/*创建文件输出路径*/
while ((len = is.read(bt)) != -1){
fos.write(bt,0,len);
}
/*通过该is把客户端获取的文件存入数组,并把该信息通过fos.write()方法写到本机文件*/
os.write("Succeess".getBytes());
/*回复客户端,文件传输成功*/
fos.close();
accept.close();
serverSocket.close();
/*关闭流和连接*/
}
}
更新中…