TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另外称为客户机程序,两个的功能和编写方法不大一样。服务器端与客户端的交互过程如下:
(1)、服务器程序创建一个ServerSocket,调用accept()方法等待客户机来连接
(2)、客户端程序创建一个Socket,请求余服务器建立连接
(3)、服务器接收客户机的连接请求,同时创建一个新的Socket与客户建立连接。服务器继续等待新的请求
一、InetAddress类
java.net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息,常用方法如下:
方法 | 返回值 | 说明 |
---|---|---|
getByName(String host) | InetAddress | 获取与host相对应的InetAddress对象 |
getHostAddress() | String | 获取InetAddress对象所含的IP地址 |
getHostName() | String | 获取此IP地址的主机名 |
getLocalHost() | InetAddress | 返回本地主机的InetAddress对象 |
通过以下实例来进行说明:
import java.net.InetAddress;
public class Address {
public static void main(String args[]) {
InetAddress ip;
try {
ip = InetAddress.getLocalHost();
String localName = ip.getHostName();
String localIp = ip.getHostAddress();
System.out.println("本机名:"+localName);
System.out.println("本机IP地址:"+localIp);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
/*输出结果如下:
本机名:Timmor
本机IP地址:192.168.0.104
*/
二、ServerSocket类
java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是等待来自网上的“请求”,它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的 连接请求被拒绝。队列的默认大小是50.
ServerSocket类的构造方法都抛出IOException异常,分别有以下几种形式。
1、ServerSocket():创建非绑定服务器套接字
2、ServerSocket(int port):创建绑定到特定端口的服务器套接字
3、ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号
4、ServerSocket(int port,int backlog,InetAddress bindAddress):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
ServerSocket类的常用方法如下:
方法 | 返回值 | 说明 |
---|---|---|
accept() | Socket | 等待客户机的连接,若连接,则创建一套接字 |
isBound() | boolean | 判断ServerSocket的绑定状态 |
getInetAddress() | InetAddress | 返回此服务器套接字的本地地址 |
isClosed() | boolean | 返回服务器套接字的关闭状态 |
close() | void | 关闭服务器套接字 |
bind(SocketAddress endpoint) | void | 将ServerSocket绑定到特定地址 |
getInetAddress() | int | 返回服务器套接字等待的端口号 |
三、TCP网络程序
在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户就发送消息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接受数据,通过下列简单实例进行说明。
TCP服务器端程序:
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MyTcp {
private BufferedReader reader;
private ServerSocket server;
private Socket socket;
void getServer() {
try {
server = new ServerSocket(8998);
System.out.println("服务器套接字已经创建成功");
while(true) {
System.out.println("等待客户机连接...");
socket = server.accept();
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
getClientMessage();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private void getClientMessage() {
try {
while(true) {
System.out.println("客户机:"+reader.readLine());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
try {
if(reader != null) {
reader.close();
}
if(socket != null) {
socket.close();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void main(String args[]) {
MyTcp tcp = new MyTcp();
tcp.getServer();
}
}
运行结果如下:
TCP客户机端程序:
package test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
public class MyClien extends JFrame{
private PrintWriter writer;
Socket socket;
private JTextArea ta = new JTextArea();
private JTextField tf = new JTextField();
Container cc;
public MyClien(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc = this.getContentPane();
final JScrollPane sp = new JScrollPane();
sp.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(sp,BorderLayout.CENTER);
sp.setViewportView(ta);
cc.add(tf,"South");
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
writer.println(tf.getText());
ta.append(tf.getText()+'\n');
ta.setSelectionEnd(ta.getText().length());
tf.setText("");
}
});
}
private void connect() {
ta.append("尝试连接\n");
try {
socket = new Socket("127.0.0.1",11111);
writer = new PrintWriter(socket.getOutputStream(),true);
ta.append("完成连接\n");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void main(String agrs[]) {
MyClien clien = new MyClien("向服务器送数据");
clien.setSize(200,200);
clien.setVisible(true);
clien.connect();
}
}
运行结果如下:
当客户端输入TTTTT后,服务器也会收到TTTTT: