TCP协议;建立两台机器的可靠的双向的传输协议,两个机器各有一个插座scoket而连接
3Socket插座:连接网络上两个程序间双向通讯的端点插座!
服务器将一个socket绑定到特定程序端口上,并用socket等待和监听客户请求。
一旦连接成功,服务器端使用新的绑定其他端口的socket与客户端读写操作,为了保证原有端口能继续监听其他客户端,处理多个请求。
1服务器端建立连接的步骤:ServerSocket类并不是插座,只监听来自客户端的socket连接,用于产生socket
1new ServerSocket(int port); 将一个socket绑定到特定程序端口上
2ServerSocket对象调用accept 方法。会线程阻塞的方法,直到客户端建立连接,才能继续执行,返回一个Socket对象
3返回的Socket对象,说明已经和client端建立成功,通过getOutputStream,getInputStream,完成信息读写
4Socket对象.close();
2client端建立连接的步骤:Socket类
1new Socket(“123.123.12.1”,int port);指定服务器程序,并自动建立连接
2Socket对象通过getOutputStream,getInputStream,完成信息读写
3Socket对象.close();
3运行测试:打开一个命令窗口,运行服务器端class文件,作为服务器,再打开一个窗口,运行客户端class文件,作为客户端窗口,多个客户端,就运行多次客户端class程序
4常用的IO流操作:要背下来!!
1从网络输入流中读数据:如服务器端读客户端发来的数据
BufferedReader br=
new BufferedReader(new InputStreamReader(scoket.getInputStream()));
String line=null;
while((line=br.readLine())!=null){System.out.print(line);}
2从网络输出流里写数据:如服务器端向客户端发送数据
PrintStream ps=new PrintStream(scoket.getOutputStream());
ps.println(“aaa”);输出数据 直接输出字符串 方便!!
3从网络输入流中读并输出到另一个网络输出流中
BufferedReader br=
new BufferedReader(new InputStreamReader(scoket.getInputStream()));
String line=null;
//之前是服务器获得客户端信息直接打印到窗口,现在要打印到每个client端的socket流中
while((line=br.readLine())!=null){
for(Socket s:sockets){
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(line);
}
4 从键盘中敲入信息,键盘的标准输入流,输出到服务器端的输出流:
//从键盘读信息,写入服务器端
BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));从键盘读入
String line=null;
while((line=br.readLine())!=null){
//输出到服务器端
PrintStream ps=new PrintStream(scoket.getOutputStream());
ps.println(line);输出到服务器
}
5用BufferedReader读的时候一定要防止死循环!!!因为readLine()没有读到换行符时,会阻塞,一直等到读到换行符,读到换行符后就执行,执行后又会while循环,这样不停得去读是死循环,下面的程序得不到运行!!应当单独起一个线程给它,让他一直去读
while((line=br.readLine())!=null){}本身就是个死循环,下面的程序不会执行
1服务器向客户端传递数据
class Server{
main(){
ServerSocket ss=new ServerSocket(3000);监听3000端口号
print(“服务器等待连接”);
Scoket socket=ss.accept(); 没有连接会阻塞,只显示等待连接,一旦连接成功返回一个socket用于通信了!
//向客户端写入东西,获得输出流
PrintStream ps=new PrintStream(scoket.getOutputStream());
ps.println(“aaa”);输出数据
ps.printn(“wefwef”);
}}
class Client{
main(){
Scoket socket=new Socket(“服务器程序所在ip地址,测试开发一般是本机”,30000);建立连接,服务器端结束阻塞。
//客户端为了获得服务器端的信息,需要获得inputstream
BufferedReader br=
new BufferedReader(new InputStreamReader(scoket.getInputStream()));
String line=null;
while((line=br.readLine())!=null){print(line);}
br.close();
}}
服务器端和客户端是分别的两个线程,客户端是等服务器全部写完读,还是每写一个读一个,是随机的。以上只是服务器向客户端传递数据
2客户端向服务器传递数据:
class Server{
main(){
ServerSocket ss=new ServerSocket(3000);监听3000端口号
print(“服务器等待连接”);
Scoket socket=ss.accept(); 没有连接会阻塞,只显示等待连接,一旦连接成功返回一个socket用于通信了!
//从客户端读入信息
BufferedReader br=
new BufferedReader(new InputStreamReader(scoket.getInputStream()));
String line=null;
while((line=br.readLine())!=null){print(line);}
br.close();
}}
class Client{
main(){
Scoket socket=new Socket(“服务器程序所在ip地址,测试开发一般是本机”,30000);建立连接,服务器端结束阻塞。
//客户端向服务器写信息
BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));从键盘读入
String line=null;
while((line=br.readLine())!=null){
//输出到服务器端
PrintStream ps=new PrintStream(scoket.getOutputStream());
ps.println(line);输出到服务器
}
br.close();}
Socket通讯容易出现的问题!
java.net.SocketException: Connection reset
socket结束时,又尝试去读写就会报错!
一般是当客户端的socket关闭(断开连接时)时报错
客户端程序结束时 socket申明周期结束 也会报错!
|