A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 29198102shihao 中级黑马   /  2013-7-25 11:58  /  1467 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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申明周期结束 也会报错!

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马