网络对话程序设计

设计任务:客户端向服务器发送一字符串,并能读取服务器返回的字符串。
知识点:TCP套接字技术,C/S软件架构程序设计
重点理解:Java客户套接字类Socket和服务器套接字类ServerSocket,以及字符串读/写类BuffferedReader/PrintWriter。

功能详细描述:
客户端程序1:TCPClient.java具有网络接收和发送能力的程序。
客户端程序2:TCPClientJFrame.java为界面模块。
服务器程序:TCPServer.java具有网络接收和发送功能。

1、程序设计第一步:

新建一个程序包,建议命名为socketTCP;
制作并运行TCPServer程序,通过命令行窗口(netstat -an)察看是否已开启8008监听端口。

TCPServer的运行问题,TCPServer只能运行一次,且自身不能终止运行,要终止它运行,需要点击“运行”、“停止构建”。

套接字类有两个基本的方法可以获得两个通信管道的入口:

 Socket.getInputStream()方法可获得输入字节流的入口地址;
 Socket.getOutputStream()方法可获得输出字节流的出口地址;

2、程序设计第二步:

制作并理解TCPCilent.java程序;
(1)定义对象构造方法:
socket=new Socket(host,port);//向服务进程发起TCP三次握手连接.
Socket连接成功后,通过调用GET方法,可获得字节输出流和字节输入流,输出流用于发送信息,输入流用于接收信息。

(2)定义网络信息发送方法供外部调用:

public void send(String msg) {
  pw.println(msg); //写入网卡输出流,由系统调用底层函数,经网卡发送
}

(3)定义网络信息接收方法供外部调用:

    public String receive(){
       String msg;
       try {
          msg = br.readLine();//接收一行信息,阻塞语句。
       } catch (IOException ex) { msg=null;  }
  return msg;
 }

(4)定义网络连接关闭方法供外部调用

 public void close() {
 try {
  if(socket!=null)  
     socket.close();//实现四次握手断开,如图2.3所示.
} catch (IOException ex) {  }
}

3、程序设计第三步:

创建窗体:

在“连接”按钮中设置如下动作:

String ip=jTextField2.getText();
String port=jTextField3.getText();
try {
    ec=new TCPClient(ip,port);
    jTextArea1.append("服务器连接成功.\r\n");
} catch (IOException ex) {
   jTextArea1.append("服务器连接失败.\r\n");
}   

在“发送”按钮中添加网络发送和接收方法:

String msg1=jTextField1.getText();  
ec.send(msg1);//发送一串字符。
String msg2=ec.receive(); //接收一行字符串。
jTextArea1.append(msg2);  
附件1:

TCPClient.java源文件如下:

  import java.net.*;
  import java.io.*;

public class TCPClient {
  //套接字程序设计.  
  private Socket socket=null;

  //用于字节和字符之间转换用的变量.
private PrintWriter pw;中
private BufferedReader br;

public TCPClient(String ip,String port) throws IOException{
  
socket=new Socket(ip,Integer.parseInt(port));
 //主动向服务器发起连接,实现TCP中三次握手的过程。
 //若不成功(网络问题,地址错误,服务器资源紧张等),抛出错误,其错误信息交由调用者处理。
 //若成功,做下面两件事情。    
 
 OutputStream socketOut = socket.getOutputStream();
 pw=new PrintWriter(new OutputStreamWriter(socketOut,"GB2312"),true);
 //得到网络输出字节流地址,并装饰成网络输出字符流
 
 InputStream socketIn = socket.getInputStream();
 br=new BufferedReader(new InputStreamReader(socketIn,"GB2312"));
 //得到网络输入字节流地址,并装饰成网络输入字符流
}

public void send(String msg){
      pw.println(msg);
      //输出字符流,由Socket调用系统底层函数,经网卡发送字节流。
 }

public String receive(){
String msg;
    try {
        msg = br.readLine();
      //从网络输入字符流中读信息,每次只能接收一行信息.
    //若不够一行(无行结束符),该语句阻塞(阻塞语句),直到条件满足,程序才往下运行
    } catch (IOException ex) { msg=null;  }

 return msg;
}

public void close() {
 try {
  if(socket!=null)  
     socket.close();//实现四次握手断开.
} catch (IOException ex) {  }

}

 //模块内测试与运行,需先运行TCPServer。
public static void main(String args[]) throws IOException{
TCPClient tc=new TCPClient("127.0.0.1","8008");
ec.send("123456789");//发送一行字符串
System.out.println(ec.receive());//接收一行字符串并在屏幕上显示
ec.close();      
}
}
附件2:

TCPServer.java源文件如下:

import java.io.*;
import java.net.*;

public class TCPServer {
private int port=8008;
private ServerSocket serverSocket;//服务器套接字。

public TCPServer() throws IOException {
serverSocket = new ServerSocket(8008);//开启8008号监听端口。
System.out.println("服务器启动");
}    

private PrintWriter putWriter(Socket socket)throws IOException{
OutputStream socketOut = socket.getOutputStream();//获得输出流缓冲区的地址。
return new PrintWriter(new OutputStreamWriter(socketOut,"GB2312"),true);

}
private BufferedReader getReader(Socket socket)throws IOException{
 InputStream socketIn = socket.getInputStream();//获得输入流缓冲区的地址
return new BufferedReader(new InputStreamReader(socketIn,"GB2312"));
}


public void service() {//单客户版本,即每次只能同时和一个客户建立通信连接。
while (true) {
  Socket socket=null;
  try {
 socket = serverSocket.accept(); 
     //阻塞语句,监听并等待客户发起连接,有连接请求就生成一个套接字。
 System.out.println("New income: "+socket.getInetAddress());
    //本地服务器观测台显示请求的用户信息。
    BufferedReader br =getReader(socket);//定义字符串输入流。
    PrintWriter pw = putWriter(socket);//定义字符串输出流。

    String msg;
    while ((msg = br.readLine())!= null) //阻塞语句,从输入流中读入一行字符串。
     {
         pw.println("来自服务器:"+msg);//向输出流中输出一行字符串。
         //pw.println("来自服务器2:"+msg);
         if (msg.equals("bye")) //如果客户发送的消息为“bye”,就结束通信
          break;
    }
  }catch (IOException e) {
     e.printStackTrace();
  }finally {
     try{
       if(socket!=null)
           socket.close();  //断开连接
     }catch (IOException e) {e.printStackTrace();}
  }
}
}

public static void main(String args[])throws IOException {
new TCPServer().service();
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,712评论 0 4
  • 1、OC中创建线程的方法是什么?如果指定在主线程中执行代码?如何延时执行代码。【难度系数★★】 1)创建线程的方法...
    木旁_G阅读 1,948评论 2 16
  • 一两身教胜过一吨言教。 children see children do . 以前有太多孩子想上学却没学上,...
    Yanacaleb阅读 284评论 0 1
  • 暖阳亲吻花海 我从梦中醒来 层层叠叠的花 像妈妈温暖的臂弯 将我揽在 最芬芳的地带 我把歌声藏入 芳香扑鼻的花丛 ...
    白勻荨阅读 229评论 0 0