版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shytry/article/details/79282159
基础知识点:
TCP(传输控制协议):确保数据的传输,也确保数据包以它们发送的顺序正确发送。(流套接字)
UDP(用户数据报协议):用在IP上标准的,低代价,无连接,主机对主机的协议。(数据套接字)
套接字:两个主机之间连接的端点,用于发送和接收数据。
常出现的异常:
java.net.BindException:端口使用冲突
java.net.UnknownHostException:找不到主机
java.net.ConnectException:由于服务器没有运行,客户端会出现该异常
java.io.EOFException:没有清空缓冲区数据流,获取完整数据出错
java.net.SocketException: Socket is not bound yet:服务器类中没有写端口号
例如: ServerSocket serverSocket=new ServerSocket(8000);//端口号8000要写
网络通信过程:
服务器:server创建serversocket
ServerSocket serversocket=new ServerSocket(端口号);
服务器等待连接请求
Socket socket=serversocket.accept();
客户端创建套接字请求连接服务器
Socket socket=new Socket(IP地址/域名,端口号)
客户端-服务器(计算面积)
客户端:
import javax.swing.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class Client extends JFrame{
/*输入输出流*/
private DataOutputStream toServer;
private DataInputStream fromServer;
public static void main(String [] args){
new Client();
}
public Client(){
try{
/*定义输入流--从控制台获取输入*/
Scanner sc=new Scanner(System.in);
/*设置连接到服务器*/
Socket socket=new Socket("localhost",8000);
fromServer=new DataInputStream(socket.getInputStream());
toServer=new DataOutputStream(socket.getOutputStream());
while(true){
/*获取数据radius*/
double radius=Double.parseDouble(sc.next());
/*传送到服务器*/
toServer.writeDouble(radius);
/*清空缓存区数据流*/
***toServer.flush();***--缺少该语句会出现异常四
/*得到服务器计算后的数据*/
double area=fromServer.readDouble();
System.out.println("Radius is "+radius+"\n");
System.out.println("Area received from the server is "+area+'\n');
}
}catch (IOException ex){
System.out.println(ex.toString());
}
}
}
服务器:
import javax.swing.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class Server extends JFrame {
public static void main(String [] args){
new Server();
}
public Server(){
try{
/*创建套结字*/
ServerSocket serverSocket=new ServerSocket(8000);
System.out.println("Server started at "+new Date()+'\n');
/*设置服务器监听*/
Socket socket=serverSocket.accept();
/*设置输入输出流*/
DataInputStream inputFromClient=new DataInputStream(socket.getInputStream());
DataOutputStream outputToClient=new DataOutputStream(socket.getOutputStream());
while(true){
System.out.println("begin");
/*从客户端接收数据*/
double radius=inputFromClient.readDouble();
/*计算面积*/
double area=radius*radius*Math.PI;
/*将结果传给客户端*/
outputToClient.writeDouble(area);
System.out.println("Radius received from client: "+radius+'\n');
System.out.println("Area fount: "+area+'\n');
}
}catch (IOException e){
System.err.println(e);
}
}
}