JAVA第九章作业- 网络通信

9-7. 说明一个客户端如何从服务器上读取一行文本。

  • TCP/IP的方式是:客户端与服务器端成功握手以后,从Socket中得到数据输入流并用相应的包装器进行包装,以输入流中相应的read方法来读取一行的文本。
  • UDP数据报的方式是:建立数据报的DatagramSocket对象以后,调用DatagramSocket对象的receive方法来等待服务器的数据到来,接收到数据以后用DatagramPacket对象的getData方法来将接收到的数据提取出来。

9-9. 采用套接字的连接方式编写一个程序,允许客户向服务器提出一个名字,如果这个文件存在,就把文件内容发送给客户,否则回答文件不存在。

程序代码如下

//客户端
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

import javax.swing.JFrame;


public class TranFileClient extends JFrame implements ActionListener {
    Button btn;

    TextField tf;
    
    public TranFileClient(){
        //布局
          super("要接收的文件名");
          setBounds(400,400,300,100);
          setVisible(true);
          btn=new Button("接收");
          tf=new TextField(7);
          setLayout(new FlowLayout());
          add(tf);
          add(btn);
          
          btn.addActionListener(this);
         
          validate();
          addWindowListener(new WindowAdapter()
             {  public void windowClosing(WindowEvent e)
                  { System.exit(0);   } 
             });
    
    }
    public static void main(String[] args){
        new TranFileClient();

    }
    /* (non-Javadoc)
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent arg0) {
        try {
            Socket st = new Socket("localhost",3997);
            //给服务器文件名
            DataOutputStream outServ =new DataOutputStream( st.getOutputStream());
            outServ.writeUTF(tf.getText().trim());
            //读服务器的消息
            FileOutputStream out = new FileOutputStream(tf.getText().trim());
            InputStream netin = st.getInputStream();
            InputStream in = new DataInputStream(new BufferedInputStream(netin));
            System.out.println("geting data.....");
            byte[] buf=new byte[2048];
            //
            
            int num = in.read(buf);
            while(num != -1){
                out.write(buf, 0, num);
                num = in.read(buf);
            }
            //取出服务器的状态
            String str=new String(buf);
            if(TranFileServer.PROP.equals(str.trim())){
                tf.setText("文件没有找到!");  
            }
            in.close();
            out.close();
            outServ.close();
            System.out.println("recieved over.....");
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

服务器
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;

public class TranFileServer {
    //查找的文件的目录
    final static String PATH = "d:/src";
    final static String PROP = "NO";
    boolean isExist = false;
    public TranFileServer() {
        init();
    }

    private void init() {
        ServerSocket server;
        Socket st;
        String s = null;
        
        try {
            server = new ServerSocket(3997);
            System.out.println("waiting client connect");
            st = server.accept();
            //读客户端来的文件名
            try {
                DataInputStream in = new DataInputStream(st.getInputStream());
                while (true) {
                    s = in.readUTF();
                    if (s != null)
                        break;
                }
                System.out.println(s);
            } catch (IOException e) {
                System.out.println("ERRO:" + e);
                throw e;
            }

            doCheck(s);
            if (isExist) {
                FileInputStream fos = new FileInputStream(PATH+"/"+s);
                OutputStream netout = st.getOutputStream();
                DataOutputStream doc = new DataOutputStream(
                new BufferedOutputStream(netout));
                System.out.println("sending data....");
                byte[] buf = new byte[2048];
                int num = fos.read(buf);
                while (num != -1) {
                    doc.write(buf, 0, num);
                    doc.flush();
                    num = fos.read(buf);
                }
                fos.close();
                doc.close();
            }else{
                OutputStream netout = st.getOutputStream();
                DataOutputStream doc = new DataOutputStream(
                new BufferedOutputStream(netout));
                doc.write(PROP.getBytes());
                doc.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 文件是否存在判断
     * 
     * @param s
     * @return
     */
    private void doCheck(String s) {
        boolean isExist;
        //文件是否存在
        File file = new File(PATH);
        String[] filenames = file.list();
        for (int i = 0; i < filenames.length; i++) {
            String str = filenames[i];
            if (str.equals(s)) {
                this.isExist = true;
                return;
            }
        }
    }

    public static void main(String[] args) {
          new TranFileServer();
    }
}

9-10. 写出使用多线程使得一个服务器同时为多个客户程序服务的基本框架。

程序代码如下

/**
 * 多客户端一个服务器的例子
 */
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

class C_client extends Frame implements ActionListener {
    TextArea txt1;

    Button btn;

    Panel p;

    int port;

    DataInputStream in = null; //数据输入流

    DataOutputStream out = null; //数据输出流

    Socket c_socket; //套接字

    InputStream in_data; //接收到的输入流         

    OutputStream out_data; //发送的输出流

    String str; //存放接收的数据

    int i = 0;

    C_client() {
        super("客户端");
        setSize(300, 200);
        setVisible(true);
        txt1 = new TextArea(5, 4);
        add(txt1, BorderLayout.CENTER);
        p = new Panel();
        add(p, BorderLayout.NORTH);
        btn = new Button("连接");
        p.add(btn);
        btn.addActionListener(this);
        validate();
    }

    public static void main(String[] args) {
        new C_client();
    }

    public void actionPerformed(ActionEvent eee) {
        try {
            c_socket = new Socket("127.0.0.1", 4321);

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            in_data = c_socket.getInputStream();

            out_data = c_socket.getOutputStream();
            in = new DataInputStream(in_data);
            out = new DataOutputStream(out_data);

            int p1 = c_socket.getPort();
            int p2 = c_socket.getLocalPort();

            txt1.append("获取到对方的端口号: " + p1 + "\n");
            txt1.append("本机的端口号: " + p2 + "\n");

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {

            str = in.readUTF();
            txt1.append("客户收到:" + str + "\n");
            if (i > 10) {
                out.writeUTF("end");
                c_socket.close();
                System.exit(0);
            }//发出end信息
            else {
                out.writeUTF("I am Client");
                i++;
            }

        } catch (IOException e) {
            System.out.println("ddd");
        }

    }

}


/**
 * 多客户端一个服务器的例子
 */
import java.net.*;import java.io.*;
import java.awt.*;import java.awt.event.*;
class S_server extends Frame implements ActionListener,Runnable
{
    ServerSocket     s_socket;  //服务器端套接字
    Socket           c_socket;  //套接字
    DataInputStream  in=null;   //数据输入流
    DataOutputStream out=null;  //数据输出流
    InputStream      in_data;   //接收到的输入流         
    OutputStream     out_data;  //发送的输出流
    int         i=0;            //计数(连接的客户数)
    String      str;
    TextArea    txt1;
    Button      btn;
    Panel       p;
 S_server()
   {
      super("server");
      setSize(300,200);   
      setVisible(true);
      txt1=new TextArea(5,4);  
      add(txt1,BorderLayout.CENTER);
      p=new Panel();          
      add(p,BorderLayout.NORTH);
      btn=new Button("开始监听端口");
      p.add(btn);     
      validate();
      btn.addActionListener(this);
    }
  public void actionPerformed(ActionEvent eee)
    {
      try{
          s_socket=new ServerSocket(4321);
          while(true)
            {
            c_socket=s_socket.accept();
             Thread t=new Thread(this);
             t.start();
             i++;
            } 
         }catch(IOException e){  }   
    }
    //线程
   public void run()
    {
      try { 
         while(true)
          {
           in_data=c_socket.getInputStream();
           out_data=c_socket.getOutputStream();
           in=new DataInputStream(in_data);
           out=new DataOutputStream(out_data);
           out.writeUTF("Hello,我是服务器");
           str=in.readUTF();
           if (str.equals("end"))
             {//接收到end信息,则断开连接
              in.close();
              out.close();
              c_socket.close();
             }
           txt1.append("第"+i+"个客户发来:"+str+"\n");
           Thread.sleep(200);
          } //while_end
       }
       catch(IOException e){  
        e.printStackTrace();
        }   
       catch(Exception ee){
       ee.printStackTrace();    
       }  //Thread_catch
    }
 public static void main(String[] args) 
  {
    new  S_server();
  }
}

9-11. 编写简易云计算程序,一个客户同时有多个服务器为他提供服务的基本框架。

程序代码如下

/**
 * 一个客户端多个服务器的例子
 */

import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

class C_client1 extends Frame implements ActionListener, Runnable {
    TextArea txt1;
    Button btn;
    Panel p;
    int port;
    DataInputStream in = null; //数据输入流
    DataOutputStream out = null; //数据输出流
    //套接字
    InputStream in_data; //接收到的输入流
    OutputStream out_data; //发送的输出流
    String str; //存放接收的数据

    String[] IP = new String[] { "127.0.0.1", "127.0.0.2", "127.0.0.3" }; //服务器的IP

    int IPi = 0; //IP的下标

    C_client1() {
        super("客户端");
        setSize(300, 200);
        setVisible(true);
        txt1 = new TextArea(5, 4);
        add(txt1, BorderLayout.CENTER);
        p = new Panel();
        add(p, BorderLayout.NORTH);
        btn = new Button("连接");
        p.add(btn);
        btn.addActionListener(this);
        validate();
    }

    public static void main(String[] args) {
        new C_client1();
    }

    public void actionPerformed(ActionEvent eee) {
        Thread t1 = new Thread(this);
        t1.start();
        Thread t2 = new Thread(this);
        t1.start();
        Thread t3 = new Thread(this);
        t1.start();
    }

    public void run() {
        Socket c_socket = null;
        try {
            c_socket = new Socket(IP[IPi++], 4321);

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            in_data = c_socket.getInputStream();

            out_data = c_socket.getOutputStream();
            in = new DataInputStream(in_data);
            out = new DataOutputStream(out_data);

            String p1 = c_socket.getInetAddress().getHostAddress();
            int p2 = c_socket.getLocalPort();

            txt1.append("获取到对方的IP: " + p1 + "\n");
            txt1.append("本机的端口号: " + p2 + "\n");
            str = in.readUTF();
            txt1.append("客户收到:" + str + "\n");
            out.writeUTF("I am Client");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

/**
 * 一个客户端多个服务器的例子
 */

import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

class S_server1 extends Frame implements ActionListener{
    ServerSocket s_socket; //服务器端套接字
    Socket c_socket; //套接字
    DataInputStream in = null; //数据输入流
    DataOutputStream out = null; //数据输出流
    InputStream in_data; //接收到的输入流         
    OutputStream out_data; //发送的输出流
    int i = 0; //计数(连接的客户数)
    String str;
    TextArea txt1;
    Button btn;
    Panel p;

    S_server1() {
        super("server");
        setSize(300, 200);
        setVisible(true);
        txt1 = new TextArea(5, 4);
        add(txt1, BorderLayout.CENTER);
        p = new Panel();
        add(p, BorderLayout.NORTH);
        btn = new Button("开始监听端口");
        p.add(btn);
        validate();
        btn.addActionListener(this);
    }

    public void actionPerformed(ActionEvent eee) {
        try {
            s_socket = new ServerSocket(4321);
            c_socket = s_socket.accept();
            in_data = c_socket.getInputStream();
            out_data = c_socket.getOutputStream();
            in = new DataInputStream(in_data);
            out = new DataOutputStream(out_data);
            out.writeUTF("Hello,我是服务器");
            str = in.readUTF();
            in.close();
            out.close();
            c_socket.close();
        } catch (IOException e) {
        }
 //Thread_catch
    }

    public static void main(String[] args) {
        new S_server();
    }
}

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,234评论 11 349
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,046评论 25 707
  • 回杭州了,今天网络不好。--大栗致自己 简单分享一下:职场上让你脱颖而出的3个建议。 第一,跟老板建立牢固的关系。...
    有杕之杜阅读 169评论 0 1