- 了解socket使用
项目目标:
实现本地的客户端与服务器一问一答.
Socket
1 .IP
1.1什么是IP?
IP是根据TCP/IP协议划定,由32位二进制数组成,而且在因特网上是唯一的数值
例如:某台计算机,连上网的IP是:
11010101 01001001 11110000 11001100
为了便于记忆,会将这32位二进制数,每8位一组,每段之间用小数点分割
11010101.01001001.11110000.11001100
再将每八位转化为十进制
213.73.240.204
1.2 如何查看自己电脑的ip?
-
按win+R, 输入cmd,打开dos窗口
-
在dos窗口输入ipconfig
1.2 什么是端口号
- 端口号(port number)就是计算机为了给每个网络程序分配一个独一无二的区别符,有了这些端口号,就可以准确定位到具体的程序。
- 端口号是个整数,范围0-65535,就是当开启一个程序时,计算机就分配给应用程序一个端口.
Socket概述
在计算机领域中,Socket也被称为套接字编程,它是计算机之间进行通信的一种约定或者说是一种方式。
应用程序可以通过它发送或者接收数据,可以对其发送过来的内容像处理文件一样,打开、关闭或者读写等操作,套接字允许应用程序将I/O插入到互联网上,并与网络中的其他程序进行通信。
Socket常用方法
服务器端ServerSocket
在服务器端选择一个端口号,然后在指定的端口号上等待客户端发起的连接
构造方法:
ServerSocket(int port) 创建一个绑定特定端口号的服务器套接字
accept() 侦听并接受到发送到此套接字的连接
close() 关闭此套接字
客户端Socket
构造方法:
Socket(String host,int port) 创建一个套接字,并且连接到host,并且绑定端口号
getInputStream() 返回此套接字的输入流
getOutputStram() 返回此套接字的输出流
close() 关闭此套接字
项目步骤
分别在socket包下新建两个类:
Server
/**
* 服务器
*/
public class Server {
/**
* java.net.ServerSocket
* ServerSocket 是运行在服务端的,它的主要工作:
* 1:打开服务端口(客户端就是通过这个端口与服务端建立链接)
* 2:监听该服务端口,一旦一个客户端链接,则会返回一个 Socket 实例,并通过这个 Socket 实例与链接的 * 客户端进行交互
* 如果我们将 Socket 比喻为"电话",那么 ServerSocket 相当于是"总机"。
*/
ServerSocket serverSocket;
public Server() {
try {
/**
*如果端口被占用则会报异常:
* java.net.BindException:address already in use
* 解决办法:
* 更换端口号,直到运行成功为止.
*/
*/
serverSocket = new ServerSocket(8088);//设置服务器端口号
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
System.out.println("等待客户端链接");
/**ServerSocket提供的重要方法
* Socket accept()
* 该方法用户接受客户端的链接,并返回一个Socket实例与连接的客户端交互
* 该方法是一个阻塞方法,调用后程序会卡住,直到一个客户端链接为止.
*/
Socket socket = serverSocket.accept();
System.out.println("客户端已链接");
InputStream input = socket.getInputStream();//获取输入流,接收客服端消息
byte[] bytes = new byte[1024*10];//字节数组,用来将接收的消息进行存储
int d = input.read(bytes);//目前发送的消息很少,不用循环读取,直接读取到bytes数组中
String s = new String(bytes,0,d);//将读来的字节数组中的内容转换为String打印
System.out.println(s);//打印
OutputStream output = serverSocket.getOutputStream();//获取输出流
output.write("服务器发:你好客服端!".getBytes("utf8"));//响应给客户端一句话
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server().start();
}
}
Client
package socket1;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 客户端
*/
public class Client {
/**
* java.net.Socket 套接字,原意是插座
* Socket 封装了 TCP 协议的通讯细节,我们使用他可以与远端计算机建立 TCP 链接。
* 并基于一堆流的 IO 操作完成与远端计算机的数据交换。
我们可以将Socket比喻为"电话"
*/
Socket socket;
public Client() {
try {
/**
* 实例化Socket时就是与远端计算机建立连接的过程
* 这里需要传入两个参数:
* 1.服务器的ip地址,用于找到网络上对方的计算机
2.服务器端口,用于找到服务端计算机上的服务器应用程序
*/
System.out.println("正在连接服务器");
socket = new Socket("localhost", 8088);//1.ip地址 2.端口号
System.out.println("已连接服务器");
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
OutputStream output = socket.getOutputStream();//获取输出流,通过流发给服务器消息
String message = "客户端发:服务器你好!";//消息内容
output.write(message.getBytes("utf8"));//将消息内容转换为字节数组写出
InputStream input = socket.getInputStream();//获取输入流,准备接收服务器返回的消息
byte[] bytes = new byte[1024 * 10];
int d = input.read(bytes);//将接受的消息存储给字节数组
String s = new String(bytes, 0, d);//将字节数组的内容转换为String
System.out.println(s);//打印
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().start();
}
}
上篇文章:入门Java编程的知识点—>Map(day18)-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/141554619下篇文章: 入门Java编程的知识点—>Http协议(day20)-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/141590909