TCP网络设计是利用Socket类(套接字)编写通信程序。
PS:套接字可以比作是一个连接装置(工具,像用电器必须要插插头连接才能使用!!
TCP协议进行通信应用程序分为 服务器程序 、 客户机程序
设计流程
- 创建服务器套接字
- 创建客户端套接字
- 服务器启动监听
- 处理传输数据(服务器、客户端)
- 启动服务器
- 启动客户端
Class InetAddress
java.lang.Object
java.net.InetAddress
InetAddress类表示Internet协议(IP)地址。IP地址是由IP使用的32位或128位无符号数字,构建UDP和TCP协议的低级协议
InetAddress类常用方法
修饰符 | 方法 | 说明 |
---|---|---|
String | getHostName() | 获取IP地址的主机名 |
String | getHostAddress() | 获取IP地址字符串 |
InetAddress | getByName() | 获取与Host对应的InetAddress对象 |
InetAddress | getLocalHost() | 返回本主机的InetAddress对象 |
其余的方法自查API
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Address {
public static void main(String[] args) {
try {
InetAddress ip = InetAddress.getLocalHost();
String myname = ip.getHostName();
String myip = ip.getHostAddress();
System.out.println("本机名:"+myname);
System.out.println("本机IP:"+myip);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
Class ServerSocket
java.lang.Object
java.net.ServerSocket
ServerSocket类 实现了服务器套接字。等待通过网络进入的请求。服务器会根据该请求执行一些操作,然后可能将结果返回给请求者
构造方法
ServerSocket() :创建未绑定的服务器套接字
ServerSocket(int port)
:指定端口
ServerSocket(int port, int backlog) :指定端口并设置连接上限
ServerSocket(int port, int backlog, InetAddress bindAddr) :指定端口并设置连接上限和绑定IP地址
参数说明
**port:**端口号
**backlog:**请求进入连接队列的最大长度
**bindAddr:**服务器将绑定到的本地InetAddress
ServerSocket类常用方法
修饰符 | 方法 | 说明 |
---|---|---|
Socket | accept() | 等待客户端的连接,连接则创建套接字 |
boolean | isBound() | 判断ServerSocket的绑定状态 |
InetAddress | getInetAddress() | 获取服务器套接字的本地地址 |
boolean | isClosed() | 获取服务器套接字的关闭状态 |
void | close() | 关闭服务器套接字 |
void | bind(SocketAddress endpoint) | 将ServerSocket绑定到特定地址(IP地址、端口号) |
其余的方法自查API
Class Socket
java.lang.Object
java.net.Socket
Socket类 实现客户端套接字, 套接字是两台机器之间通讯的端点
构造方法
Socket() :创建未连接的套接字
Socket(IntetAddress address , int port) :连接指定IP和端口号
Socket(String host , int port) :连接指定主机和端口号
Socket类常用方法
修饰符 | 方法 | 说明 |
---|---|---|
InputStream | getInputStream() | 获取套接字输入流 |
OutputStream | getOutputStream() | 获取套接字输出流 |
boolean | isConnected() | 查看套接字是否连接 |
void | close() | 关闭套接字 |
InetAddress | getInetAddress() | 返回连接主机的地址 |
其余的方法自查API
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MyTcp {
//缓存字节输入流
private BufferedReader reader;
private ServerSocket server;
private Socket socket;
//服务器套接字连接并接收数据
private 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()));
//接收客户端消息
getClinetMessage();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void getClinetMessage(){
try {
while (true){
System.out.println("客户端:"+reader.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
try {
//结束 客户端、缓存字节流
if(reader != null){
reader.close();
}
if(socket != null){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcp tcp = new MyTcp();
tcp.getserver();
}
}
客户端:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MyClien extends JFrame {
//输出流 ,方便打印输出
private PrintWriter writer;
private Socket socket;
//多行文本 (文本域
private JTextArea ta = new JTextArea();
//单行文本
private JTextField tf = new JTextField();
//滚动条
JScrollPane scrollPane = new JScrollPane(ta);
private Container c = getContentPane();
public MyClien(String title){
super(title);
setDefaultCloseOperation(3);
ta.setFont(new Font("微软雅黑",Font.PLAIN,20));
tf.setFont(new Font("微软雅黑",Font.PLAIN,20));
//添加并设置布局
c.add(scrollPane , BorderLayout.CENTER);
c.add(tf , BorderLayout.SOUTH);
tf.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
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" , 8998);
//参数2:刷新缓冲区中的数据 (开
writer = new PrintWriter(socket.getOutputStream() , true);
ta.append("连接成功\n");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyClien clien = new MyClien("向服务器送数据");
clien.setBounds(400 , 300 , 300 , 250);
clien.setVisible(true);
clien.connect();
}
}
先运行 服务端 再运行 客户端