(面试中可能会被问到)
-- Java
中提供了
java.net
包,该包下的类是针对网络编程
Java
可以编写基于
TCP
的网络开发也可以编写基于
UDP
的网络开发
--基于
TCP
使用
ServiceSocket(
服务端
)
和
Socket(
客户端
)
这两个类实现
--基于
UDP
使用
DatagramSocket(
即表示发送方也表示接收方
)类实现
基于TCP的Scoket的实现?
服务端代码
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
/*** 基于Socket的服务器类 */
public class Server {
public static void main(String[] args) throws IOException {
/***
创建服务端对象并指定服务端接收端口号 * 服务端地址为当前电脑的IP地址
*/
ServerSocket server = new ServerSocket(6789);
System.out.println("服务器已启动....");
while(true){
System.out.println("等待客户端连接....");
/*** accept()方法表示等待客户端连接,此时当前程序会进入阻塞状态等待客户端连接 * 当有客户端连入服务器后,服务端会生成一个针对该客户端的socket对象,并使用该对象与 客户端通信 */
Socket clientSocket = server.accept();
//获得客户端提交的数据
//获得客户端的IP地址
InetAddress clientIP = clientSocket.getInetAddress();
//获得客户端的端口号
int clientPort = clientSocket.getPort();
System.out.println("客户端:"+clientIP+",通过端口:"+clientPort+"连入服务 端....");
//获得socket的输入流对象
InputStream input = clientSocket.getInputStream();
//缓存字节数组
byte[] buf = new byte[1024];
//获得客户端传入的数据
int len = input.read(buf);
//将读取到的字节数组转换为字符串并输出
String content = new String(buf,0,len,"UTF8");
System.out.println("客户端端"+clientIP+"说:");
//通过Socket获得输出流对象
OutputStream output = clientSocket.getOutputStream(); String str = "好的很饱!";
output.write(str.getBytes("UTF8"));
output.flush();
System.out.println(content);
}
}
}
客户端实现
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.OutputStream;
import java.io.InputStream;
/*** 基于TCP的客户端实现 */
public class Client {
public static void main(String[] args) throws IOException {
//创建InetAddress IP地址对象
InetAddress ip = InetAddress.getByName("127.0.0.1");
/*** 创建客户端的Socket对象 * 并指定服务端的IP地址和监听端口号 */
Socket socket = new Socket(ip,6789);
String content = "你好,吃了吗?";
//获得该socket的输出流对象
OutputStream output = socket.getOutputStream();
output.write(content.getBytes("UTF8"));
output.flush();
//获得socket的输入流对象
//获得socket的输入流对象
InputStream input = socket.getInputStream();
//缓存字节数组
byte[] buf = new byte[1024];
//获得客户端传入的数据
int len = input.read(buf);
//将读取到的字节数组转换为字符串并输出
String str = new String(buf,0,len,"UTF8");
System.out.println(str); output.close(); socket.close(); } }
基于TCP的Scoket的实现?
服务端代码
import java.net.*;
import java.io.*;
/** 基于UDP的服务端实现 */
public class Server{
public static void main(String[] args)throws IOException{
//创建服务端对象并绑定服务端端口号
DatagramSocket server = new DatagramSocket(6666);
while(true){
//创建用于存放接收数据的byte数组
byte[] buf = new byte[1024];
//创建数据报包对象
DatagramPacket packet = new DatagramPacket(buf,buf.length);
System.out.println("服务端已启动,等待客户端连接....");
//接收客户端的请求,该方法会让服务端进入阻塞状态,等待客户端连接
server.receive(packet);
//从数据包中获取数据
byte[] data = packet.getData();
//将数据转换为字符串
String str = new String(data,0,packet.getLength(),"utf8");
System.out.println(str);
}
}
}
客户端代码
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.DatagramPacket;
import java.io.*;
/*基于UDP的客户端实现 */
public class Client{
public static void main(String[] args)throws IOException{
//创建客户端对象
DatagramSocket client = new DatagramSocket();
/* 创建数据报包对象 创建数据包对象时要指定数据包中的数据以及服务端的地址ip和端口号 */
String content = "喝点!";
byte[] buf = content.getBytes("utf8");
//服务端的ip地址
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buf,buf.length,ip,6666);
//发送数据包到指定的服务端
client.send(packet);
client.close();
}
}