博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
19.2 TCP程序设计基础
阅读量:5342 次
发布时间:2019-06-15

本文共 21172 字,大约阅读时间需要 70 分钟。

1、InetAddress类

  java.net包中的inetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。
InetAddress类的常用方法如下:

方法 返回值 说明
getByName(String host) InetAddress 获取与Host相对应的InetAddress对象
getHostAddress() String 获取InetAddress对象所包含的IP地址
getHostName() String 获取此IP地址的主机名
getLocalHost() InetAddress 返回本地主机的InetAddress对象

  注意:InetAddress类的方法会抛出UnknownHostException异常,所以必须进行异常处理。这个异常在主机不存在或网络连接错误时发生。

2、ServerSocket类

  java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是等待来自网络上的“请求”,它可通过制定的端口来等待连接的套接字。服务器套接字依次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入队列中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。队列的默认大小是50.

  ServerSocket类的构造方法都抛出IOException异常,分别有以下几种形式:
    ServerSocket():创建非绑定服务器套接字
    ServerSocket(int port):创建绑定到特定端口的服务器套接字
    ServerSocket(int port, int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号
    ServerSocket(int prot, int backlog, InetAddress bindAddress):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。这种情况适用于极端及上有多块网卡和多个IP地址的情况,用于可以明确规定ServerSocket在哪块网卡或IP地址上等待客户的连接请求。
ServerSocket类的常用方法如下:

方法 返回值 说  明
accept() Socket 等待客户机的连接。若连接,则创建一套接字
isBound() boolean 判断ServerSocket的绑定状态
getInetAddress() InetAddress 返回此服务器套接字的本地地址
isClosed() boolean 返回服务器套接字的关闭状态
close() void 关闭服务器套接字
bind(SocketAddress endpoint) void 将ServerSocket绑定到特定地址(IP地址和端口号)
getInetAddress() int 返回服务器套接字等待的端口号

  调用ServerSocket类的accept()方法会返回一个和客户端Socket对象向连接的Socket对象,服务器的Socket对象使用getOutputStream()方法获得的输出流将指向客户端Socket对象使用getInputStream()方法获得的那个输入流;同样,服务器端的Socket对象使用getInputStream()方法获得的输入流将指向客户端Socket对象使用getOutputStream()方法获得的那个输出流。也就是说,当服务器向输出流协议信息时,客户端通过相应的输入流就能读取,反之亦然。

  注意:(1)、accept()方法会阻塞线程的继续执行,知道接收到客户的呼叫。如果没有客户呼叫服务器,那么System.out.print(“连接中”)语句将不会执行。语句如果没有客户请求,accept()方法没有发生阻塞,肯定是程序出现了问题。通常是使用了一个还在被其它程序占用的端口号,ServerSoket绑定没有成功。
             (2)、当一台机器上安装了多个网络应用程序时,很可能指定的端口号已被占用。还可能遇到以前运行良好的网络程序突然运行不了的情况,这种情况很可能也是由于端口被别的程序韩勇了。此时可以运行netstat -an来查看该程序锁使用的端口号是否被占用。

3、相关参考例子

1 package com.lzw; 2  3 import java.io.*; 4 import java.net.*; 5  6 public class MyTcp { // 创建类MyTcp 7     private BufferedReader reader; // 创建BufferedReader对象 8     private ServerSocket server; // 创建ServerSocket对象 9     private Socket socket; // 创建Socket对象socket10     11     void getserver() {12         try {13             server = new ServerSocket(8998); // 实例化Socket对象14             System.out.println("服务器套接字已经创建成功"); // 输出信息15             while (true) { // 如果套接字是连接状态16                 System.out.println("等待客户机的连接"); // 输出信息17                 socket = server.accept(); // 实例化Socket对象18                 reader = new BufferedReader(new InputStreamReader(socket19                         .getInputStream())); // 实例化BufferedReader对象20                 getClientMessage(); // 调用getClientMessage()方法21             }22         } catch (Exception e) {23             e.printStackTrace(); // 输出异常信息24         }25     }26     27     private void getClientMessage() {28         try {29             while (true) { // 如果套接字是连接状态30                 if (reader.ready()) {31                     // 获得客户端信息32                     System.out.println("客户机:" + reader.readLine());33                 }34             }35         } catch (Exception e) {36             e.printStackTrace(); // 输出异常信息37         }38         try {39             if (reader != null) {40                 reader.close(); // 关闭流41             }42             if (socket != null) {43                 socket.close(); // 关闭套接字44             }45         } catch (IOException e) {46             e.printStackTrace();47         }48     }49     50     public static void main(String[] args) { // 主方法51         MyTcp tcp = new MyTcp(); // 创建本类对象52         tcp.getserver(); // 调用方法53     }54 }
View Code

1 package com.lzw; 2  3 import java.awt.*; 4 import java.awt.event.*; 5 import java.io.*; 6 import java.net.*; 7  8 import javax.swing.*; 9 import javax.swing.border.*;10 11 public class MyClien extends JFrame { // 创建类继承JFrame类12     /**13      * 14      */15     private static final long serialVersionUID = 1L;16     private PrintWriter writer; // 声明PrintWriter类对象17     Socket socket; // 声明Socket对象18     private JTextArea ta = new JTextArea(); // 创建JtextArea对象19     private JTextField tf = new JTextField(); // 创建JtextField对象20     Container cc; // 声明Container对象21     22     public MyClien(String title) { // 构造方法23         super(title); // 调用父类的构造方法24         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);25         cc = this.getContentPane(); // 实例化对象26 27         final JScrollPane scrollPane = new JScrollPane();28         scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));29         getContentPane().add(scrollPane, BorderLayout.CENTER);30         scrollPane.setViewportView(ta);31         cc.add(tf, "South"); // 将文本框放在窗体的下部32         tf.addActionListener(new ActionListener() {33             // 绑定事件34             public void actionPerformed(ActionEvent e) {35                 // 将文本框中信息写入流36                 writer.println(tf.getText());37                 // 将文本框中信息显示在文本域中38                 ta.append(tf.getText() + '\n');39                 ta.setSelectionEnd(ta.getText().length());40                 tf.setText(""); // 将文本框清空41             }42         });43     }44     45     private void connect() { // 连接套接字方法46         ta.append("尝试连接\n"); // 文本域中提示信息47         try { // 捕捉异常48             socket = new Socket("127.0.0.1", 8998); // 实例化Socket对象49             writer = new PrintWriter(socket.getOutputStream(), true);50             ta.append("完成连接\n"); // 文本域中提示信息51         } catch (Exception e) {52             e.printStackTrace(); // 输出异常信息53         }54     }55     56     public static void main(String[] args) { // 主方法57         MyClien clien = new MyClien("向服务器送数据"); // 创建本例对象58         clien.setSize(200, 200); // 设置窗体大小59         clien.setVisible(true); // 将窗体显示60         clien.connect(); // 调用连接方法61     }62 }
View Code

1 package com.lzw; 2  3 import java.net.*; 4  5 public class MyHost { 6     public static void main(String args[]) { 7         InetAddress ip = null; 8          9         try {10             ip = InetAddress.getByName("localhost");// 修改为指定的主机名称11             System.out.println("主机名:" + ip.getHostName());12             System.out.println("主机IP地址:" + ip.getHostAddress());13             System.out.println("本机IP地址:"14                     + InetAddress.getLocalHost().getHostAddress());15         } catch (UnknownHostException e) {16             e.printStackTrace();17         }18         19     }20 }
View Code

1 package com.lzw; 2  3 import java.io.*; 4 import java.net.*; 5  6 /** 7  * @author Administrator 8  */ 9 public class ComputerServer {10     public static void main(String[] args) {11         try {12             ServerSocket ss = new ServerSocket(8001);13             while (!ss.isClosed()) {14                 Socket s = ss.accept();15                 InputStream ips = s.getInputStream();16                 OutputStream ops = s.getOutputStream();17                 String str = "欢迎进入程序\n2.编写TCP服务器程序,"18                         + "实现创建一个在8001端口上等待的ServerSocket"19                         + "对象,当接收到一个客户机的连接请求后,"20                         + "程序从与客户机建立了连接的Socket对象中获得输入输出"21                         + "流。通过输出流向客户机发送信息。";22                 ops.write(str.getBytes());23                 byte[] buf = new byte[1024];24                 int len = 0;25                 if (ips.available() > 0)26                     len = ips.read(buf);27                 System.out.println(new String(buf, 0, len));28                 ips.close();29                 ops.close();30                 s.close();31             }32             ss.close();33         } catch (IOException e) {34             e.printStackTrace();35         }36     }37 }
View Code
1 package com.lzw;  2   3 import java.awt.*;  4 import java.awt.event.*;  5 import java.io.*;  6 import java.net.*;  7   8 import javax.swing.*;  9  10 public class TestClient extends JFrame { 11      12     /** 13      *  14      */ 15     private static final long serialVersionUID = 1L; 16     private JTextArea textArea; 17     private JTextField portField; 18     private JTextField hostField; 19      20     /** 21      * Launch the application 22      *  23      * @param args 24      */ 25     public static void main(String args[]) { 26         EventQueue.invokeLater(new Runnable() { 27             public void run() { 28                 try { 29                     TestClient frame = new TestClient(); 30                     frame.setVisible(true); 31                 } catch (Exception e) { 32                     e.printStackTrace(); 33                 } 34             } 35         }); 36     } 37      38     /** 39      * Create the frame 40      */ 41     public TestClient() { 42         super(); 43         setBounds(100, 100, 500, 212); 44         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 45          46         final JPanel panel = new JPanel(); 47         panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 48         getContentPane().add(panel, BorderLayout.NORTH); 49          50         final JLabel label = new JLabel(); 51         label.setText("连接主机:"); 52         panel.add(label); 53          54         hostField = new JTextField(); 55         hostField.setText("localhost"); 56         panel.add(hostField); 57          58         final JLabel label_1 = new JLabel(); 59         label_1.setText("端口:"); 60         panel.add(label_1); 61          62         portField = new JTextField(); 63         portField.setText("8001"); 64         panel.add(portField); 65          66         final JButton button = new JButton(); 67         button.addActionListener(new ActionListener() { 68             public void actionPerformed(final ActionEvent e) { 69                 final String hostName = hostField.getText(); 70                 String portNum = portField.getText(); 71                 final int port = Integer.parseInt(portNum); 72                 new Thread() { 73                     public void run() { 74                         try { 75                             final InetAddress host = InetAddress.getByName(hostName); 76                             Socket socket = new Socket(host, port); 77                             final InputStream is = socket.getInputStream(); 78                             InputStreamReader reader=new InputStreamReader(is); 79                             int data = 0; 80                             while ((data=reader.read()) != -1) { 81                                 textArea.append((char)data+""); 82                                 textArea.revalidate(); 83                                 Thread.sleep(100); 84                             } 85                         } catch (Exception e1) { 86                             textArea.append(e1.toString()); 87                             e1.printStackTrace(); 88                         } 89                     } 90                 }.start(); 91                  92             } 93         }); 94         button.setText("连接"); 95         panel.add(button); 96          97         final JScrollPane scrollPane = new JScrollPane(); 98         getContentPane().add(scrollPane, BorderLayout.CENTER); 99         100         textArea = new JTextArea();101         textArea.setLineWrap(true);102         scrollPane.setViewportView(textArea);103     }104 }
View Code

1 package com.lzw;  2   3 //服务器端程序  4 import java.awt.*;  5 import java.io.*;  6 import java.net.*;  7 import java.util.*;  8 import java.util.List;  9  10 import javax.swing.*; 11  12 public class TCPServer extends JFrame { 13     /** 14      *  15      */ 16     private static final long serialVersionUID = 1L; 17     private ServerSocket ss = null; 18     private boolean bStart = false; 19      20     private JTextArea taContent = new JTextArea(); 21      22     private int index = 0; 23      24     List
clients = new ArrayList
(); 25 26 public void launchFrame() { 27 // Container con = this.getContentPane(); 28 taContent.setEditable(false); 29 30 taContent.setBackground(Color.DARK_GRAY); 31 taContent.setForeground(Color.YELLOW); 32 this.add(taContent); 33 this.setSize(300, 350); 34 this.setLocation(400, 200); 35 this.setTitle("TCP Server"); 36 this.setVisible(true); 37 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 38 tcpMonitor(); 39 } 40 41 public void tcpMonitor() { 42 try { 43 ss = new ServerSocket(8888); 44 bStart = true; 45 } catch (IOException e) { 46 47 e.printStackTrace(); 48 } 49 50 try { 51 while (bStart) { 52 index++; 53 Socket s = ss.accept(); 54 Client c = new Client(s); 55 clients.add(c); 56 57 taContent.append(s.getInetAddress().getHostAddress() 58 + " connected " + index + " clients\n"); 59 new Thread(c).start(); 60 61 } 62 } catch (IOException e) { 63 e.printStackTrace(); 64 } finally { 65 try { 66 ss.close(); 67 } catch (IOException e) { 68 69 e.printStackTrace(); 70 } 71 } 72 73 } 74 75 public static void main(String args[]) { 76 TCPServer ts = new TCPServer(); 77 ts.launchFrame(); 78 } 79 80 private class Client implements Runnable { 81 DataInputStream dis = null; 82 DataOutputStream dos = null; 83 84 Socket s = null; 85 boolean bStart = false; 86 87 Client(Socket s) { 88 this.s = s; 89 try { 90 dis = new DataInputStream(s.getInputStream()); 91 dos = new DataOutputStream(s.getOutputStream()); 92 } catch (IOException e) { 93 e.printStackTrace(); 94 } 95 96 bStart = true; 97 } 98 99 public void sendToEveryClient(String str) {100 try {101 dos.writeUTF(str);102 dos.flush();103 104 } catch (IOException e) {105 index--;106 clients.remove(this);107 taContent.append(s.getInetAddress().getHostAddress()108 + " exited " + index + " clients\n");109 System.out.println("对方退出了!我从List里面去掉了!");110 }111 }112 113 public void run() {114 try {115 while (bStart) {116 String str = dis.readUTF();117 System.out.println(str);118 for (int i = 0; i < clients.size(); i++) {119 Client c = clients.get(i);120 c.sendToEveryClient(str);121 }122 }123 } catch (EOFException e) {124 clients.remove(this);125 taContent.append(s.getInetAddress().getHostAddress()126 + " exited " + clients.size() + " clients\n");127 System.out.println("client closed");128 } catch (SocketException e) {129 System.out.println("client closed");130 } catch (IOException e) {131 e.printStackTrace();132 } finally {133 try {134 if (s != null)135 s.close();136 if (dis != null)137 dis.close();138 if (dos != null)139 dos.close();140 } catch (IOException e) {141 e.printStackTrace();142 }143 }144 }145 146 }147 148 }
View Code

1 package com.lzw;  2   3 import java.awt.*;  4 import java.awt.event.*;  5 import java.io.*;  6 import java.net.*;  7   8 import javax.swing.*;  9  10 public class TCPClient extends JFrame { 11     /** 12      *  13      */ 14     private static final long serialVersionUID = 1L; 15     TextArea taContent = new TextArea(); 16     JTextField tfTxt = new JTextField(20); 17      18     JButton send = new JButton("发送"); 19     JButton connect = new JButton("连接"); 20     JButton clear = new JButton("清空"); 21      22     boolean live = false; 23     JPanel p1 = new JPanel(); 24     JPanel p2 = new JPanel(); 25      26     Socket s = null; 27     DataOutputStream dos = null; 28     DataInputStream dis = null; 29      30     boolean bConnected = false; 31      32     Thread t = new Thread(new RecToServer()); 33      34     public void launchFrame() { 35          36         taContent.setEditable(false); 37          38         p2.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 5)); 39         p2.add(send); 40         p2.add(connect); 41         p2.add(clear); 42          43         Container con = this.getContentPane(); 44          45         con.add(taContent, "North"); 46         con.add(tfTxt, "Center"); 47         con.add(p2, "South"); 48          49         this.setSize(300, 350); 50         this.setLocation(400, 200); 51         this.setTitle("Chat Client"); 52          53         this.setVisible(true); 54         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 55          56         connect.addActionListener(new Connect()); 57         send.addActionListener(new SendMsg()); 58         clear.addActionListener(new ActionListener() { 59             public void actionPerformed(ActionEvent e) { 60                 taContent.setText(""); 61             } 62         }); 63     } 64      65     public void connectToServer() { 66         try { 67              68             s = new Socket("127.0.0.1", 8888); 69             dos = new DataOutputStream(s.getOutputStream()); 70             dis = new DataInputStream(s.getInputStream()); 71              72             bConnected = true; 73              74         } catch (BindException e) { 75             System.out.println("找不到指定的服务器"); 76         } catch (UnknownHostException e) { 77             // TODO Auto-generated catch block 78             e.printStackTrace(); 79         } catch (IOException e) { 80             // TODO Auto-generated catch block 81             e.printStackTrace(); 82         } 83          84     } 85      86     public void disConnect() { 87         try { 88             if (s != null) { 89                 s.close(); 90             } 91              92             if (dos != null) { 93                 dos.close(); 94             } 95             if (dis != null) { 96                 dis.close(); 97             } 98         } catch (IOException e) { 99             e.printStackTrace();100         }101     }102     103     public static void main(String args[]) {104         TCPClient tc = new TCPClient();105         tc.launchFrame();106     }107     108     private class Connect implements ActionListener {109         public void actionPerformed(ActionEvent e) {110             if (e.getActionCommand() == "连接") {111                 112                 connectToServer();113                 try {114                     t.start();115                 } catch (IllegalThreadStateException ex) {116                     117                 }118                 119                 connect.setText("断开连接");120                 121             } else if (e.getActionCommand() == "断开连接") {122                 disConnect();123                 connect.setText("连接");124             }125             126         }127     }128     129     private class SendMsg implements ActionListener {130         public void actionPerformed(ActionEvent e) {131             if (connect.getActionCommand() == "连接") {132                 JOptionPane.showMessageDialog(TCPClient.this,133                         "没有找到指定的服务器", "错误提示", 1);134             } else {135                 String str = tfTxt.getText();136                 tfTxt.setText("");137                 138                 try {139                     dos.writeUTF(str);140                     dos.flush();141                 } catch (SocketException ex) {142                     System.out.println("没有找到指定的服务器");143                     JOptionPane.showMessageDialog(TCPClient.this,144                             "没有找到指定的服务器", "错误提示", 1);145                 } catch (IOException ex) {146                     ex.printStackTrace();147                 }148             }149             150         }151     }152     153     private class RecToServer implements Runnable {154         public void run() {155             try {156                 while (bConnected) {157                     String str = dis.readUTF();158                     // System.out.println(str);159                     160                     taContent.append(str + "\n");161                 }162             } catch (SocketException e) {163                 System.out.println("服务器已关闭");164             } catch (IOException e) {165                 e.printStackTrace();166             }167         }168     }169 }
View Code

 

转载于:https://www.cnblogs.com/studycode/p/9588362.html

你可能感兴趣的文章
局部加载样式
查看>>
str字符串 center( ) 方法
查看>>
Swift学习笔记(7)--控制流
查看>>
Web Service简介 内部资料 请勿转载 谢谢合作
查看>>
BZOJ2038[2009国家集训队]小Z的袜子(hose)——莫队
查看>>
测试百度地图输入GPS经纬度显示位置API
查看>>
HDFS执行getDatanodeReport输出信息
查看>>
重建道路
查看>>
OC中NSLog函数输出格式罗列
查看>>
牛客练习赛36
查看>>
JS如何监听动画结束
查看>>
12/14/2018 Airbnb的面试反思
查看>>
[恢]hdu 1037
查看>>
[恢]hdu 1859
查看>>
学习进度
查看>>
一篇关于年度计划的科学研究
查看>>
spring mvc 接收页面表单List
查看>>
MVC学习(四)几种分页的实现(1)
查看>>
java正则表达式
查看>>
模块与包管理工具
查看>>