首先客户端与服务器是两个端口也就是两个服务器,其次服务器的端口是你首先定义好的如果没有指定客户端的端口号那么客户端的端口号是随机分配的,最后用accept得到不同的请求 一般都用线程来工作 这样只占用一块内存地址 这样就会按照时间片选择不同的进程工作只是处理一个Socket,而不是很多个.
客户端与服务端的通信过程:
客户端的相关API:
服务端的相关API:
TCP传输
1、tcp分为(客户端)和(服务端)
2、客户端对应的对象是Socket,服务端对应的对象是ServerSocket。
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务端式两个独立的应用程序。
下面是我的一台电脑上的程序:主要用来模拟和另外一台电脑之间通信
客户端:
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道进行
数据的传输。
需求:
给服务端发送一个文本数据。
步骤:
1、创建socket服务,并指定要连接的主机和端口。
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args)throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.10.111",10005);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp i am coming".getBytes());
s.close();
}
}
需求:定义端点接受数据并打印在控制台上
服务端:
1、建立服务端的socket服务,ServerSocket();
并监听一个端口
2、获取连接过来的客户端对象。通过ServerSocket的accept方法。所以这个方法是组塞式的。
3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。
4、关闭服务。(可选操作)
class TcpServer
{
public static void main(String[] args)throws Exception
{
//建立服务端socket服务。
ServerSocket ss = new ServerSocket(10006);
//通过accept方法获取连接过来的客户端对象
Socket s =ss.accept();
String server_ip = s.getInetAddress().getHostAddress();
String client_ip = s.getLocalAddress().getHostAddress();
int server_port = s.getPort();
int client_port = s.getLocalPort();
System.out.println("server_ip:"+server_ip);
System.out.println("client_ip:"+client_ip);
System.out.println("server_port:"+server_port);
System.out.println("client_port:"+client_port);
//获取客户端发送来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in=s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端,数据都传完了,你这客户端还想跟我连着,不是占资源吗?
ss.close();//选择性关闭,服务端服务一次就结束了。
}
}
另外一台电脑的部分:
class TcpClient
{
public static void main(String[] args)throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.10.111",10006);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp i am coming".getBytes());
s.close();
}
}
class TcpServer
{
public static void main(String[] args)throws Exception
{
//建立服务端socket服务。
ServerSocket ss = new ServerSocket(10005);
//通过accept方法获取连接过来的客户端对象
Socket s =ss.accept();
String server_ip = s.getInetAddress().getHostAddress();
String client_ip = s.getLocalAddress().getHostAddress();
int server_port = s.getPort();
int client_port = s.getLocalPort();
System.out.println("server_ip:"+server_ip);
System.out.println("client_ip:"+client_ip);
System.out.println("server_port:"+server_port);
System.out.println("client_port:"+client_port);
//获取客户端发送来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in=s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端,数据都传完了,你这客户端还想跟我连着,不是占资源吗?
ss.close();//选择性关闭,服务端服务一次就结束了。
}
}
一台主机客户端打开,另外一台的服务端如下:
-----------------------------
server_ip:192.168.9.19
client_ip:192.168.10.111
server_port:8241
client_port:10006
tcp i am coming
-----------------------------
------------------------------