一、TCP传输
- Socket和ServerSocket
- 建立客户端和服务器端
- 建立连接后,通过Socket中的IO流进行行数据的传输
- 关闭Socket
- 同样,客户端和服务器端是两个独立的应用程序
二、Socket
- 此类实现客户端套接字(也可以就叫“套接字”)。
- 套接字是两台机器间通信的端点。
- 套接字的实际工作由 SocketImpl 类的实例执行。
- 应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
public class Socket
{
//通过系统默认类型的 SocketImpl 创建未连接套接字
public Socket(){}
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
public Socket(InetAddress address,
int port)
throws IOException{}
//创建一个流套接字并将其连接到指定主机上的指定端口号。
public Socket(String host,
int port)
throws UnknownHostException,
IOException{}
//关闭此套接字
public void close()
throws IOException{}
//将此套接字连接到服务器
public void connect(SocketAddress endpoint)
throws IOException{}
//将此套接字连接到服务器,并指定一个超时值。超时值零被解释为无限超时。在建立连接或者发生错误之前,连接一直处于阻塞状态。
public void connect(SocketAddress endpoint,
int timeout)
throws IOException{}
//返回套接字连接的地址。
public InetAddress getInetAddress(){}
//返回此套接字的输入流
public InputStream getInputStream()
throws IOException{}
//返回此套接字的输出流。
public OutputStream getOutputStream()
throws IOException{}
//返回此套接字连接到的远程端口
public int getPort(){}
//此套接字的输入流置于“流的末尾”。发送到套接字的输入流端的任何数据都将被确认然后被静默丢弃。
public void shutdownInput()
throws IOException{}
//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列
public void shutdownOutput()
throws IOException{}
}
三、ServerSocket
- 此类实现服务器套接字。
- 服务器套接字等待请求通过网络传入。
- 它基于该请求执行某些操作,然后可能向请求者返回结果。
- 服务器套接字的实际工作由 SocketImpl 类的实例执行。
- 应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字
public class ServerSocket
{
//创建非绑定服务器套接字。
public ServerSocket()
throws IOException{}
//创建绑定到特定端口的服务器套接字。端口 0 在所有空闲端口上创建套接字
//传入连接指示(对连接的请求)的最大队列长度被设置为 50。如果队列满时收到连接指示,则拒绝该连接
public ServerSocket(int port)
throws IOException{}
//利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。端口号 0 在所有空闲端口上创建套接字
//传入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数。如果队列满时收到连接指示,则拒绝该连接
public ServerSocket(int port,
int backlog)
throws IOException{}
//侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
public Socket accept()
throws IOException{}
//关闭此套接字
public void close()
throws IOException{}
}
四、示例
- Socket在对象建立时,就可以去连接指定主机
- 因为TCP是面向连接的,所以在建立Socket服务时,就要有服务器端存在
- 连接成功,形成通路后,就可以在该通道进行数据的传输
/**
*需求:建立一个文本转换服务器
* 客户端给服务器发送文本,服务端会将文本转换成大写返回给客户端
* 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束
*分析:
* 1,建立服务
* 2,获取键盘录入
* 3,将数据发给服务器
* 4,读取服务器返回的大些数据
* 5,结束,关资源
*/
import java.io.*;
import java.net.*;
class Client
{
public static void main(String[] args)throws Exception
{
//创建客户端的socket服务,指定目的主机和端口
Socket s = new Socket("192.168.0.253",10000);
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
BufferedReader brIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bwOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line=br.readLine())!=null)
{
if("over".equals(line))
break;
bwOut.write(line);
bwOut.newLine();
bwOut.flush();
String res = brIn.readLine();
System.out.println("server: "+res);
}
s.close();
br.close();
}
}
class Server
{
public static void main(String[] args)throws Exception
{
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+" 连接....");
BufferedReader brIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bwOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line=brIn.readLine())!=null)
{
bwOut.write(line.toUpperCase());
bwOut.newLine();
bwOut.flush();
}
ss.close();
}
}
/**
*需求:上传任意文件
*分析:
* 1,建立客户端服务
* 2,定义字节输入流读取硬盘文件
* 3,将数据发给服务器
* 4,接收反馈信息
* 5,结束,关资源
* 服务端:
* 1,建立ServerSocket获取连接Socket
* 2,读取数据,写入硬盘
* 3,反馈客户端,上传成功
* 4,关闭资源
*/
import java.io.*;
import java.net.*;
class Client
{
public static void main(String[] args)throws Exception
{
//创建客户端的socket服务,指定目的主机和端口
Socket s = new Socket("192.168.0.253",10000);
FileInputStream fis = new FileInputStream("e:/大打印机驱动.rar");
BufferedReader brIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
OutputStream os = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf))!=-1)
{
os.write(buf,0,len);
}
//加上结束标记
s.shutdownOutput();
String res = brIn.readLine();
System.out.println(res);
s.close();
fis.close();
}
}
class Server
{
public static void main(String[] args)throws Exception
{
ServerSocket ss = new ServerSocket(10000);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+" 连接....");
InputStream is = s.getInputStream();
FileOutputStream fos = new FileOutputStream("d:/a.rar");
BufferedWriter bwOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
byte[] buf = new byte[1024];
int len = 0;
while((len=is.read(buf))!=-1)
{
fos.write(buf,0,len);
}
bwOut.write("上传成功");
bwOut.newLine();
bwOut.flush();
ss.close();
fos.close();
}
}