Java地图服务器

今天主要是完成了地图服务器的架设。前期的解析google地图的编码的代码已经是有的,现在就把一些遇到的问题写出来。

1.Java的Socket连接后的数据传输,因为一开始用的inputstream.readutf(),所以导致在和C的联调中出现了问题,后来改成了readline()暂时解决了问题,但总觉得不是很好,尝试了read(byte[])的方法。

2.Java中的绘制图片,就是在后台建立一个BufferImage,然后creategraphics(),然后进行绘图,基本上也就这样了。

绘图代码如下:

/**
	 * @param _mapnames是9张地图的名字
	 * @return 成功是File文件  |  失败则是null
	 */
	private File drawMap(String[][] _mapdata) {
		File[][] mapfiles = new File[3][3];
		File Map = new File("Map.png");
		
		Image[][] mapImages = new Image[3][3];
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				mapfiles[i][j] = new File(_mapdata[i][j]);
			}
		}
		
		BufferedImage mapBufferedImage = new BufferedImage(SettingData.MAP_WIDTH, SettingData.MAP_HEIGHT, BufferedImage.TYPE_INT_RGB);
		Graphics mapGraphics = mapBufferedImage.createGraphics();
		try {
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					mapImages[i][j] = ImageIO.read(mapfiles[i][j]);
				}
			}
			Image car = ImageIO.read(new File(SettingData.Car_PIC));
			//-----------------------------------------------
			//区分开是为了要么一次画完,要么不画
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					mapGraphics.drawImage(mapImages[i][j], 256 * i, 256 * j, null);
				}
			}
			mapGraphics.drawImage(car, Integer.valueOf(_mapdata[3][0]), Integer.valueOf(_mapdata[3][1]), null);
			mapGraphics.dispose();
			//Map.createNewFile();
			ImageIO.write(mapBufferedImage, "PNG", Map);
		} catch (Exception e) {
			Map = null;
			e.printStackTrace();
		}
		return Map;
	}

毕竟是张简单的图片。传递的方法还是socket连接标准的多线程。

3.对文件的写入和读取,写入的上面代码提到了:ImageIO.write();的方法。

读取的则是用的inputstream.read();发送则使用流发送。详细代码如下:

/**
	 * @param _map是地图的文件
	 * @param _socket是发送目标的端口
	 * @return 表明是否发送成功
	 */
	private boolean sendMap(File _map, Socket _socket) {
		try {
			OutputStream outputStream = _socket.getOutputStream();
			byte[] MapFileByte = new byte[60000];
			int amount;
			int sum = 0;
			RandomAccessFile sendMapFile = new RandomAccessFile(_map, "r");
			while ((amount = sendMapFile.read(MapFileByte)) != -1) {
				outputStream.write(MapFileByte, 0, amount);
				sum += amount;
				System.out.println("已发送" + sum +"字节!");
			}
			outputStream.flush();
			System.out.println("清空缓冲区!");
			outputStream.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

目前的一个问题就是对方不知道我已经发送结束,不会主动断开,然后必须得我这断开outputstream,所以比较郁闷。

完整代码,其实也没什么。。。。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.