TCP通信:
Socket原理:
简介:Socket通常称为"套接字",支持TCP/IP协议的网络通信的基本操作单元
通常用于描述IP地址和端口,是一个通信链的句柄,在Internet上的主机一般运行了多个软件,
同时提供几种服务,每种服务都打开了一个Socket,并绑到一个端口上,不同的端口对应于不同
的服务.
应用程序通常通过"套接字"向网络发出请求或者应答网络请求,Socket和ServerSocket类位于
java.net包中,ServerSocket用于服务端,Socket是建立网络连接时使用的,在连接成功时,应
用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.
获取本地的地址和端口号
.java.net.Socket为套接字类,其提供了很多的方法,其中我们可以通过Socket获取本地地址
和端口号
-int getLocalPort();
该方法用于获取本地使用的端口号.
InetAddress getLocalAddress();
该方法用于套接字绑定的本地地址
-使用InetAddress获取本地地址的方法
-String getCanonicalHostName()
获取IO地址的完全限定域名//localhost/127.0.0.1
获取远端地址和端口号
.通过Socket获取远端的地址以及端口号
-int getPort();
该方法用于获取远端使用的端口号
IntAddress.getIntAddress();
该方法用于获取套接字绑定的远端地址
3.聊天室案例V1.
使用java的Socket实现客户端和服务器之间的连接,并使客户端向服务端发送一条信息
通信过程如下:
客户端 服务端
1.客户端发送"你好,服务器" 2.接收客户端的信息,并显示
方案:
步骤一:先创建客户端类Client
步骤二:创建Socket实例
步骤三:创建客户端的工作方法start()
1.首先使用Socket类的getOutputStream方法获取对应socket对象的网络字节输出流对象
2.为了写出数据,构造缓冲字符输出流PrintWriter类的对象,使用该对象的println方法下个
服务器发送数据
3.关闭Socket对象(需要异常处理,在finally语句中关闭)
步骤四:为客户端定义main方法
public class Client {
// 创建Socket实例
private Socket socket;
public Client() {
try {
socket = new Socket("localhost",8060);
} catch (Exception e) {
e.printStackTrace();
}
}
//客户端工作方法
public void start() {
try {
// 获取OutputStream对象
OutputStream os = socket.getOutputStream();
// 缓冲字符输出流
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
PrintWriter pw = new PrintWriter(osw,true);
pw.println("HelloWorld!");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(socket!=null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client c = new Client();
c.start();
}
}
步骤五:创建服务端类
1.在Server类中声明全局变量serverSocket表示一个服务器端的serverSocket对象
步骤六:创建start方法,用于读取客户端的信息
1.首先监听客户端的连接,得到socket对象
2.使用Socket类的getInputStream方法获取对应的Socket对象的网络字节输入流对象
3.构建缓冲字符输入流对象,利用readLine方法获取客户端发送来的数据
4.关闭Socket对象
public class Server {
private ServerSocket serverSocket;
Server(){
try {
serverSocket = new ServerSocket(8060);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("等待客户端的连接");
// 监听客户端的连接
try {
Socket socket = serverSocket.accept();
System.out.println("客户端已经连接");
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(isr);
System.out.println("客户端说:"+br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server s = new Server();
s.start();
}
}
测试:先启动服务端,在开始客户端
测试网络输入流和网络输出流
通过Socket获取输入流和输出流,这两个方法是用Socket通讯的关键
close()
使用Socket进行通讯完毕后,要关闭Socket以释放系统资源
-void close();
关闭套接字,当关闭该套接字后也会同时关闭由此获取的输入输出流
Server端ServerSocket监听.
创建时指定服务端口号,之后监听Socket的连接.
//创建ServerSocket并申请服务器端口为8060
ServerSocket serverSocket = new ServerSocket(8060);
监听
Socket socket = server.accept();
//方法会产生阻塞,直到某个Socket连接,并返回请求连接的Socket