前言
一、基于TCP的socket编程
1.建立服务器和客户端之间的连接
建立服务器端
package hello;
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 {
//建立服务器,ip默认本地ip,赋值一个端口
ServerSocket serverSocket=new ServerSocket(9999);
//实时等待接收
Socket socket = serverSocket.accept();
//创建读入流
InputStream inputStream = socket.getInputStream();
byte [] arr=new byte[1024];
int len;
if((len=inputStream.read(arr))!=-1){
String s=new String(arr,0,len);
System.out.println(s);
}
//关流
inputStream.close();
System.out.println("接收成功");
}
}
建立客户端
package hello;
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=new Socket("127.0.0.1",9999); //ip地址和端口号,注意服务器端和客户端保持一致
//创建流,发送
OutputStream outputStream = socket.getOutputStream();
String str=new String("我是客户端");
outputStream.write(str.getBytes());
//关流
outputStream.close();
//关客户端
socket.close();
}
}
2.创建可视化窗口
1.创建窗口
package frame;
import javax.swing.*;
/**
* 第一步 设置窗口
* */
public class demoFrame extends JFrame {
demoPanel panel=new demoPanel();
public demoFrame(){
super.setTitle("窗口");
super.setSize(800,600); //设置窗口大小
super.setLocationRelativeTo(null); //窗口的相对位置
super.add(panel); //给窗口增加画板
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口就会终止程序
super.setVisible(true); //显示窗口
}
}
2.添加画布
package frame;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 第二步 添加画布
* */
public class demoPanel extends JPanel {
BufferedImage image=null;
public demoPanel(){
try {
File file=new File("1.png"); //该图片为窗口背景
image=ImageIO.read(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//用来接收客户端的请求,对应案例中的客户端
public void startServer(){
try {
ServerSocket serverSocket=new ServerSocket(8989);
while (true){
Socket socket=serverSocket.accept();
InputStream inputStream= socket.getInputStream();
image=ImageIO.read(inputStream);
//重写绘制
repaint();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//增加画笔
@Override
public void paint(Graphics g) {
g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);
}
}
3.测试
package frame;
public class demoTest {
public static void main(String[] args) {
demoFrame frame=new demoFrame();
frame.panel.startServer();
}
}
二、综合案例
远程桌面的实现
1.创建一个客户端
package hello;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client2 {
public static void main(String[] args) throws IOException, AWTException, InterruptedException {
while (true){
//截图
//获取屏幕大小
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//转成矩形
Rectangle screenRectangle=new Rectangle(screenSize);
//机器人类
Robot robot=new Robot();
//截屏
BufferedImage image=robot.createScreenCapture(screenRectangle);
//发送服务器
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ImageIO.write(image,"png",byteArrayOutputStream);
//BufferedImage 转成字节数组
byte[] bytes= byteArrayOutputStream.toByteArray();
Socket socket=new Socket("192.168.7.33",8989);
OutputStream outputStream = socket.getOutputStream();
//写字节数组
outputStream.write(bytes);
Thread.sleep(1);
}
}
}
2.必须先启动服务器端,即可视化窗口中的测试类,然后再启动客户端
3.我们可以发现窗口中的桌面已经出来了
总结
网络编程在我们的开发过程中用的不多,主要是用于两个主机之间建立连接和发送文件的,多多学习对我们的开发有一定的帮助。