JavaSE socket编程

一、socket编程


网络通信基本概念:

   通信: 就是从一台机器上的一个软件,发送数据到另一台机器的一个软件上
   概念: 先发送数据的软件:称为客户端 
          被动接收数据的软件:称为服务端
          
    数据从一台机器发到另一台机器,目标地址如何指定?
        通过对方的ip和端口

JAVA中写socket的基本代码:

服务端:

        ServerSocket  ss = new ServerSocket(10000);
	
	Socket sc = ss.accept();

	InputStream in = sc.getInputStream();
	OutputStream out = sc.getOutputStream();	
	
	in.read()  //接收:一次读一个字节
	in.read(buf)// 接收:一次读buf长度个字节
	
	out.write("aaa".getBytes) // 发送数据

客户端:

    Socket sc = new Socket("192.168.10.130",10000)	
	// 然后收发数据即可

二、多线程 

概念: 让cpu同时以多个线程执行一个方法run() 

JAVA代码:

1、先写一个类实现runnable接口

public class Talk implements Runnable{
    
    public void run(){
        // 想用多个线程同时执行的逻辑
        
    }
    
}

2、然后创建多个线程,放入上面的Talk的对象,然后启动

new Thread(new Talk()).start();
new Thread(new Talk()).start();
new Thread(new Talk()).start();

三:将socketserver改造成多线程

先将对话逻辑写入一个runnable实现类的run方法中

public class Talk implements Runnable{
	Socket sc =null;
	public Talk(Socket sc){
		this.sc = sc;
	}
	public void run(){
		// 对话逻辑
		
	}
	
}

然后在serversocket程序中:如下改造

while(true){
    Socket sc = ss.accept();
    new Thread(new Talk(sc)).start()
}

四、从文件中快速读取想要的数据的设计思想

思想: 先把各个数据字段按照固定长度固定规律存入文件
然后,当需要找id=5这个商品的数据时,就可以根据规律算出这个商品的数据在文件中的起始位置(偏移量)

用到一个新工具: RandomAccessFile
模板代码:
 

RandomAccessFile raf = new RandomAccessFile("d:/p.dat","r");

raf.seek(56);

int id = raf.readInt();

byte[] b = new byte[20];
raf.read(b);
String name = new String(b).trim();

实现案例

1,定义一个对象

其中id用int 4个字节

name全部用20个字节表示

price用float  4个字节

因此每个商品为28个字节

package cn.edu360.javase24.day13.datafind.demo;

public class Prodcut {
	
	private int id;
	private String name;
	private float price;
	
	
	public Prodcut(int id, String name, float price) {
		this.id = id;
		this.name = name;
		this.price = price;
	}


	public int getId() {
		return id;
	}


	public void setId(int id) {
		this.id = id;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public float getPrice() {
		return price;
	}


	public void setPrice(float price) {
		this.price = price;
	}
	
	
	
	
	

}

实现:

​
import java.io.RandomAccessFile;

public class ReadData {
	
	/**
	 * 根据id查找商品
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public Prodcut findProductById(int id) throws Exception{
		
		// 可以从文件中任何位置开始读数据的工具:RandomAccessFile
		RandomAccessFile raf = new RandomAccessFile("d:/p.dat", "r");
		
		// 读id为2的那个商品的数据
		long pos = id*28;
		
		// 让raf的读取位置跳到指定的pos位置
		raf.seek(pos);
		
		// 然后开始读数据即可
		//  先读4个字节返回一个整数
		int pId = raf.readInt();
		
		// 再读20个字节
		byte[] b = new byte[20];
		int read = raf.read(b);
		// 然后将这20个字节转成字符串,但是尾部有大量空格
		String string = new String(b);
		// 去掉首尾的空格
		String name = string.trim(); 
		
		// 再读价格
		float price = raf.readFloat();
		
		raf.close();
		
		
		Prodcut prodcut = new Prodcut(pId, name, price);
		return prodcut;
	}
	

​

猜你喜欢

转载自blog.csdn.net/qq_41686130/article/details/97285716