概述:所谓网络编程,即通过网络实现数据的传送与接收。也就实现了人与人通过机器与机器之间的通信实现了通信。
编程:下面将列出网络编程常用的方法,而其实常用方法用的的很少,其中,客户端拥有创建输入输出流的方法,为数据传输的实现提供里必要的帮助
InetAddress类常用方法:
①InetAddress getLocalHost():获取本地主机名
②InetAddress getByName(String host):根据主机名获取IP地址
ServerSocket(服务器端)常用方法:
①ServerSocket(int port):创建客户端,并给定端口号
②Server accept():等待有客户端连接后返回该客户端
Socket(客户端)类方法:
①Socket(String host,int port):创建客户端,参数为要连接服务器的端口号
例一(简单的客户端与服务器端数据传输Demo):
服务端:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
public static void main(String[] args) throws Exception {
//创建服务端并确定端口号
ServerSocket server=new ServerSocket(1888);
System.out.println("等待连接");
//接收客户端,如果没有客户端连接,则该语句会阻截程序停留在该语句,不会再向下进行
Socket socket=server.accept();
System.out.println("连接成功");
//创建输入输出流,用于数据的发送与接收
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
int a=(int)(Math.random()*30);
int b=(int)(Math.random()*30);
int c=(int)(Math.random()*30);
//将所生成的数据进行输入
pw.println("服务端生成的数字为"+a+","+b+","+c);
System.out.println("服务端生成的数字为"+a+","+b+","+c);
System.out.println(br.readLine());
int sum=a+b+c;
//将所生成的数据进行输入
pw.println(sum);
System.out.println("服务端的和为:"+sum);
//输出所接收数据
String read=br.readLine();
System.out.println("客户端的和为:"+read);
if(Integer.parseInt(read)>sum) {
System.out.println("客户端获胜");
}else if(Integer.parseInt(read)<sum){
System.out.println("服务端获胜");
}else {
System.out.println("平局");
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws Exception {
//创建客户端,并制定所连接服务器的端口号
Socket socket=new Socket("localhost",1888);
System.out.println("客户端已创建");
//创建输入输出流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
int a=(int)(Math.random()*30);
int b=(int)(Math.random()*30);
int c=(int)(Math.random()*30);
//给服务端发送数据
pw.println("客户端生成的数字为"+a+","+b+","+c);
System.out.println("客户端生成的数字为"+a+","+b+","+c);
//读取服务端发送来的数据
String read=br.readLine();
System.out.println("服务端的和为:"+read);
int sum=a+b+c;
pw.println(sum);
System.out.println("客户端的和为:"+sum);
if(Integer.parseInt(read)>sum) {
System.out.println("服务端获胜");
}else if(Integer.parseInt(read)<sum){
System.out.println("客户端获胜");
}else {
System.out.println("平局");
}
}
}
注:在启动时,必须先启动服务端,再启动客户端,否则会报错。服务端不能重复启动,否则会报端口被占用异常。如果想要实现两台设备互发数据,则需要在同一局域网下通过服务端ip地址进行连接,再将服务端与客户端依次启动,在连接成功后便可进行通信。
运行结果:
服务端: 客户端:
例二(例一代码优化):
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
private ServerSocket ss;
public Server1() {
try {
ss=new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("等待连接");
try {
Socket socket=ss.accept();
System.out.println("连接成功");
int num1=(int)((Math.random()*30)+1);
int num2=(int)((Math.random()*30)+1);
int num3=(int)((Math.random()*30)+1);
//输出服务端生成的数字
System.out.println("服务端生成的数字为:"+num1+","+num2+","+num3);
//发送服务端生成的数字
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
pw.println(num1+","+num2+","+num3);
//输出客户端生成的数字
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientMessage =br.readLine();
System.out.println("客户端生成的数字为:"+clientMessage);
//输出服务端的和
System.out.println("服务端的和为:"+(num1+num2+num3));
//输出客户端的和
int sum=0;
String[] sa=clientMessage.split(",");
if(sa!=null) {
for(String s:sa) {
sum+=Integer.parseInt(s);
}
}
System.out.println("客户端的和为:"+sum);
//进行比较
if((num1+num2+num3)>sum) {
System.out.println("服务端获胜");
}else if((num1+num2+num3)<sum) {
System.out.println("客户端获胜");
}else {
System.out.println("平局");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server1 server=new Server1();
server.start();
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client1 {
private Socket socket;
public Client1() {
try {
socket=new Socket("localhost",8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
//输出服务端生成的数字
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String ServerMessage=br.readLine();
System.out.println("服务端生成的数字为:"+ServerMessage);
//输出客户端生成的数字
int num1=(int)((Math.random()*30)+1);
int num2=(int)((Math.random()*30)+1);
int num3=(int)((Math.random()*30)+1);
System.out.println("客户端生成的数字为:"+num1+","+num2+","+num3);
//发送客户端生成的数字
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
pw.println(num1+","+num2+","+num3);
//输出服务端数字的和
int sum=0;
String[] sa=ServerMessage.split(",");
for(String s:sa) {
sum+=Integer.parseInt(s);
}
System.out.println("服务端的和为:"+sum);
System.out.println("客户端的和为:"+(num1+num2+num3));
if((num1+num2+num3)<sum) {
System.out.println("服务端获胜");
}else if((num1+num2+num3)>sum) {
System.out.println("客户端获胜");
}else {
System.out.println("平局");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client1 c=new Client1();
c.start();
}
}
例三(实现客户端与服务端字符串的发送):
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server2 {
private ServerSocket ss;
public Server2() {
try {
ss=new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
//连接客户端
System.out.println("等待连接");
try {
Socket socket=ss.accept();
System.out.println("连接成功");
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
/*while(br.readLine()!=null) {
str=br.readLine();
System.out.println(str);
}*/
while(true) {
String str=br.readLine();
System.out.println(str);
String str1=sc.next();
pw.println(str1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server2 s=new Server2();
s.start();
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client2 {
private Socket socket;
public Client2() {
try {
socket=new Socket("localhost",8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
Scanner sc=new Scanner(System.in);
String exit="EXIT";
try {
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
/*while(!exit.equals("EXIT")) {
String s=sc.next();
pw.println(s);
}*/
while(true) {
String s=sc.next();
if("EXIT".equals(s)) {
break;
}
pw.println(s);
String str1=br.readLine();
System.out.println(str1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client2 c=new Client2();
c.start();
}
}
运行结果:
服务端: 客户端:
注:该代码存在缺陷,在连接成功之后必须先由客户端发送消息,在服务端接收后才能由服务端向客户端再发送消息。如果服务端先输入了消息,在回车确认后消息是无法传输的,只有在客户端发送消息后服务端之前确认发送的消息才会自动向客户端发送,本代码只是为了了解服务端与客户端互发消息过程,故该瑕疵可忽略,理解过程即可。