编写TCP服务程序,创建一个端口号位8001端口上等待的ServerSocker对象,当接收到几个客户机的连接请求后,程序从客户机建立连接Socketd对象中获得输入输出流。并通过输出流向客户发送信息

服务端:(要记得写端口号,我一开始就忘了写/(ㄒoㄒ)/~~)

package Test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务端
 * @author lenovo
 *
 */
 public class NineteenSever {
 public static void main(String[] args) {
  try {
   ServerSocket ss=new ServerSocket(8005);
   while(!ss.isClosed()){
    Socket s=ss.accept();
    OutputStream ops = s.getOutputStream();
     String str = "欢迎进入程序\n编写TCP服务器程序,"
        + "实现创建一个在8001端口上等待的ServerSocket"
        + "对象,当接收到一个客户机的连接请求后,"
        + "程序从与客户机建立了连接的Socket对象中获得输入输出"
        + "流。通过输出流向客户机发送信息。";
     ops.write(str.getBytes());//将字符串变成byte数组写入
     ops.close();
     s.close();
   }
   ss.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
 }
}

客户端:

package Test;
import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
 * 客户端
 * @author lenovo
 *
 */
public class NineteenClient extends JFrame {
    private JTextArea textArea;
    private JTextField portField;
    private JTextField hostField;
    public static void main(String[] args) {
  NineteenClient n=new NineteenClient();
  n.setVisible(true);
 }
    public NineteenClient(){
     setBounds(100 ,100,500,120);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     final JPanel panel=new JPanel();
     panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
     getContentPane().add(panel,BorderLayout.NORTH);
     final Label label=new Label();
     label.setText("连接主机:");
     panel.add(label);
     hostField=new JTextField();
     hostField.setText("localhost");
     panel.add(hostField);
     final Label label2=new Label();
     label2.setText("连接端口:");
     panel.add(label2);
     portField=new JTextField();
     portField.setText("8005");
     panel.add(portField);
     JButton button=new JButton();
     button.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    String hostName=hostField.getText();
    String portNum=portField.getText();
    int port=Integer.parseInt(portNum);
    try {
     InetAddress host=InetAddress.getByName(hostName);//实例化对应主机的InetAddress对象
     Socket socket=new Socket(host,port);//实例化socket
     InputStream is=socket.getInputStream();
     InputStreamReader reader=new InputStreamReader(is);
     int data=0;
     while((data=reader.read())!=-1){
      textArea.append((char)data+"");
     }
    } catch (Exception e1) {
     // TODO Auto-generated catch block
     textArea.append(e1.toString());
     e1.printStackTrace();
    } 
   }
  });
     button.setText("连接");
     panel.add(button);
     final JScrollPane pane=new JScrollPane();
     getContentPane().add(pane,BorderLayout.CENTER);
     textArea=new JTextArea();
     textArea.setLineWrap(true);
     pane.setViewportView(textArea);
    }
}

补充知识点:
第一个:BoxLayout(箱式布局):
箱式布局管理器。它把若干组件按水平或垂直方向依次排列放置。Swing 提供了一个实现了 BoxLayout 的容器组件Box。使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件。用水平箱和垂直箱的组合嵌套可实现类似于 GridBagLayout 的效果,但没那么复杂。这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列,而 Y_AXIS 表示垂直排列。BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列(主要实现了那俩标记和俩文本框和按钮,在同一水平线)
第二个:Socket对象
那么首先我们就从原理来看一看。这个设计原理非常类似于平时打电话进行通讯:
(1)首先通讯双方各有一台电话机,在上述模型中就是Socket;
(2)通讯一方拔打电话,试图建立连接,在上述模型中就是客户端建立JavaSocket对象;另一方随时监听有没有呼叫,当有呼叫到来时,摘机,在上述模型中就是在服务器端建立一个JavaSocket对象,然后用其accept()方法监听客户端的连接请求,当有连接请求时accept方法返回客户端的Socket,于是双方就建立起连 接;
(3)双方通话,过程中双方都可以说和听,在上述模型中,每个Socket可以利用输入输出流进行读和写两种操作;在电话中一方听到的是对方说出的,反之亦然;上述模型中,一方读出的也是对方写入的,而写入的则是对方要读出的
(4)挂断。
第三个:integer.parseint
Integer.parseInt()是把()里的内容转换成整数。baiInteger.parseInt(String)遇到一些不能被转换为整型的字符时,zhi会抛出异常。Integer.parseInt(String)的作用就是将String字符类型数据转换为Integer整型数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值