
网络编程的三要素
1、IP地址:唯一标识网络上的每一台计算机两台计算机之间通信的必备要素
2、端口号:计算机中应用的标号(代表一个应用程序) 0-1024系统使用或保留端口 ,
有效端口0-65536
3、通信协议:通信的规则TCP,UDP
1.创建客户端与服务端
实现客户端对服务器简单的通信后全部结束运行
客户端
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
模拟客户端向服务器发送一条消息
public class Client {
public static void main(String[] args) throws IOException {
//创建Socket套接字对象
Socket client = new Socket("DESKTOP-IU5NLRI",10086);
//从socket中获取输出流
OutputStream outputStream = client.getOutputStream();
//使用DataOutputStream包装流
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
//发送一条信息给服务器
dataOutputStream.writeUTF("你好,服务器,我是客户端!");
//关闭资源
dataOutputStream.close();
outputStream.close();
client.close();
}
}
注:
DESKTOP-IU5NLRI是我电脑名
服务器
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
服务器程序
public class Server {
public static void main(String[] args) throws IOException {
//创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(10086);
System.out.println("**********************服务器已开启... ...**********************");
//开启一个监听
//accept 监听到这个套接字的连接并接受它。该方法将阻塞,直到建立连接。
Socket socket = serverSocket.accept();
//从socket对象中获取输入流
//InputStream 返回一个不读取字节的新的[@code InputStream]。返回的流最初是打开的。方法关闭流* [@code close()]方法。对f@code close())的后续调用没有效果。
//getInputStream 返回此套接字的输入流。如果此套接字具有关联的通道,则生成的输入流将其所有 *** 作委托给该通道。如果通道处于非阻塞模式,则输入流的f@code read) *** 作将抛出一个[@link java.nio。频道。
InputStream inputStream = socket.getInputStream();
//使用DataInputStream包装流
//DataInputStream 和 DataOutputStream 是数据字节流,分别继承自 FilterInputStream 和 FilterOutputStream 和 实现了 DataInput 和 DataOutput。用来装饰其他的字节流。
//DataInputStream:数据字节输入流,用来装饰其他的输入流,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用 DataOutputStream (数据字节输出流)写入由 DataInputStream (数据字节输入流)读取的数据。
//DataOutputStream :数据字节输出流,用来装饰其他输出流,将 DataOutputStream 和 DataInputStream 输入流配合使用,允许应用程序以与机器无关方式从底层输入流中读写基本 Java 数据类型。
DataInputStream dataInputStream = new DataInputStream(inputStream);
//读取从客户端发送过来的数据
String a = dataInputStream.readUTF();
System.out.println("客户端说:" + a);
//关闭资源
dataInputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
运行图
2.两者互相通信
完毕后结束
客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client2 {
public static void main(String[] args) throws IOException {
//创建Socket对象
Socket client = new Socket("127.0.0.1",10000);
//从socket中获取输出流
//向服务器发送一条消息
OutputStream outputStream = client.getOutputStream();
outputStream.write("你好,服务器,我是客户端!".getBytes());
//接收服务器响应的消息
InputStream inputStream = client.getInputStream();
//读取服务器响应回来的数据
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
System.out.println("服务器说:" + new String(buffer,0,length));
//关闭资源
inputStream.close();
outputStream.close();
client.close();
}
}
服务器
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server2 {
public static void main(String[] args) throws IOException {
//创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(10000);
System.out.println("**********************服务器已开启... ...**********************");
//开启监听
Socket server = serverSocket.accept();
//接收从客户端发送的消息
InputStream inputStream = server.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
System.out.println("客户端说:" +new String(buffer,0,length));
//服务器向客户端响应一条消息
OutputStream outputStream = server.getOutputStream();
//向客户端传输数据
outputStream.write("我已收到你的消息,我是服务器!".getBytes());
//关闭资源
outputStream.close();
inputStream.close();
server.close();
serverSocket.close();
}
}
3.实现多次对话
public class Client3 {
public static void main(String[] args) throws IOException {
//创建Socket对象
for (int i = 1; i <= 5; i++) {
Socket client = new Socket("127.0.0.1",10000);
//从socket中获取输出流
//向服务器发送一条消息
OutputStream outputStream = client.getOutputStream();
outputStream.write("你好,服务器,我是客户端!".getBytes());
//接收服务器响应的消息
InputStream inputStream = client.getInputStream();
//读取服务器响应回来的数据
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
System.out.println("服务器第" + i + "次说:" + new String(buffer, 0, length));
//关闭资源
inputStream.close();
outputStream.close();
client.close();
}
}
}
public class Server3 {
public static void main(String[] args) throws IOException {
System.out.println("**********************服务器已开启... ...**********************");
for (int i = 1; i <= 5; i++) {
//创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(10000);
//开启监听
Socket server = serverSocket.accept();
//接收从客户端发送的消息
InputStream inputStream = server.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
System.out.println("客户端第" + i + "次说:" + new String(buffer, 0, length));
//服务器向客户端响应一条消息
OutputStream outputStream = server.getOutputStream();
//向客户端传输数据
outputStream.write("我已收到你的消息,我是服务器!".getBytes());
//关闭资源
outputStream.close();
inputStream.close();
server.close();
serverSocket.close();
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)