`
Only_one.zy
  • 浏览: 5625 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java 通信

阅读更多

要实现多台电脑的联通互动,就得用到通信。通信总体说起来就是服务器和客户端的数据传输。通信的过程大概是,先建立服务器,然后启动客户端连接到服务器,然后客户端将消息(数据)按协议发送给服务器,然后服务器根据相同的协议来解析消息并做出反应,或是传送给另一个客户端,或是传回原客户端,或是保存到服务器中。说起来是如此的简单,但是真正将两台电脑联通起来还是有各种各样的问题的,其中尤为重要的就是协议问题,协议必须一致,两个客户端才能实现信息的传输。在定协议的时候,读取数据的时候如果要将一个byte数组读满,最好不要使用read()方法,而是使用readFully()方法,因为使用read()方法很有可能读不满整个数组,而readFully()方法则很好的解决了这个问题。下面是最简陋的客户端与服务器之间的消息以及文件的数据传输代码:

//服务器
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer{

	/**
	 * @param args
	 */
	
	public static void main(String[] args) {
		ChatServer cs = new ChatServer();
		cs.setUpSever(3335);
		
	}
	//建立端口port的服务器
			public  void setUpSever (int port) {
				ServerSocket server;
				try {
					server = new ServerSocket(port);
				
				System.out.println("服务器创建成功     "+port);
				
				while(true){
					Socket client = server.accept();
					ClientThread ct = new ClientThread(client);
					System.out.println(client.getRemoteSocketAddress()+"客户连接");
					ct.start();
					
				}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
	
	
}


import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


public class ClientThread extends Thread{
	private Socket client ;
	public ClientThread(Socket client){
		this.client = client ;
	}
	
	public void run(){
		try {
			processChat(client);
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
		

		//处理连接对象(聊天过程)
		public void processChat (Socket client) throws IOException{
			OutputStream out =  client.getOutputStream();
			InputStream in =  client.getInputStream();
			DataInputStream din = new DataInputStream(in);
			
			String s= "欢迎来到服务器!\r\n";
			byte[] dat = s.getBytes();
			out.write(dat);
			out.flush();//强制输出
			String inputs =null;
			while(true){
				
				//消息长度
				int totalLen = din.readInt();
				//消息类型
				byte flag = din.readByte();
				//目标客户端编号
				int destNum = din.readInt();
				//根据消息类型来选择处理方式
				System.out.println("len:"+totalLen+"   flag: "+flag+"destNum:"+destNum);
				if(flag==1) {//文本消息
					System.out.print("*");
					byte [] data = new byte[totalLen];
					din.readFully(data);
					String msg = new String (data,"GBK");
					System.out.println("发送给"+destNum+":"+msg);
					
				}
				else if(flag==2){//文件消息
					//文件名
					byte [] data = new byte[256];
					din.readFully(data);
					String fileName = new String(data,"GBK").trim();//去除空格
					fileName="H:\\3.txt";
					System.out.println(fileName);
					
					//文件内容
					data = new byte [totalLen];
					System.out.println(data.length);
					din.readFully(data);
					FileOutputStream fout = new FileOutputStream(fileName);
					fout.write(data);
					fout.flush();
					fout.close();
					
					
				}
			}
			
			
		}

		
		//按行读消息(含)
		private String readString(InputStream in) throws IOException{
			//创建字符串缓冲区
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			StringBuffer stb = new StringBuffer();
			int i=0;
			while(true){
				i=in.read();
				if(i=='\r') {continue;}
				if(i=='\n') {break;}
				bos.write(i);
				
			}
			byte [] bytes = bos.toByteArray();
			
			String inputS = new String(bytes,"GBK");
			System.out.println("******"+inputS+"***********");
			return	inputS;
		}
}



//客户端
package Client;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import javax.swing.JFrame;

public class Client extends JFrame {

	/**
	 * @param args
	 */
	private static  DataOutputStream dout;
	public static void main(String[] args) {
		Client ct = new Client ();
		//client.setSize(new Dimension(300,400));
		//client.setName("客户端");
		//JButton jbt = new JButton ("发送");
		String ip="localhost";int port=3335;
		try {
			Socket client = new Socket(ip,port);
			InputStream in = client.getInputStream();
			OutputStream out = client.getOutputStream();
			dout=new DataOutputStream(out);
			
			while(true){
				System.out.println("请输入要发的文件类型:");
				Scanner sc = new Scanner(System.in);
				int type = sc.nextInt();
				
				if(type==1){
					sendTextMsg("111111111",3333);
				}
				else if(type==2){
					sendFileMsg("H:\\1.txt",3333);
				}
			}
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
	}
	
	private static void sendTextMsg(String msg, int destNum) {
		byte[] strb = msg.getBytes();
		int totallen =	strb.length;
		try {
			dout.writeInt(totallen);
			System.out.println("totallen:"+totallen);
			dout.writeByte(1);
			dout.writeInt(destNum);
			dout.write(strb);
			dout.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	private static void sendFileMsg(String fileName,int destNum){
		System.out.println(fileName);
		File file = new File(fileName);
		
		try {
			FileInputStream	in = new FileInputStream(file);
			int datalen=in.available();
			dout.writeInt(datalen);
			dout.writeByte(2);
			dout.writeInt(destNum);
			int i=0;
			byte [] fnstring = fileName.getBytes();
			
			dout.write(fnstring);
			
			i=256-fnstring.length;
			for(int j=0;j<i;j++)
				dout.write('\0');
			
			System.out.println(i);
			
			byte [] fileData = new byte[datalen];
			in.read(fileData);
			dout.write(fileData);
			dout.flush();
			
			in.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

 

分享到:
评论

相关推荐

    flex与java通信

    Flex与Java通信是Web开发中的一个重要领域,它允许前端用户界面(UI)通过富互联网应用程序(RIA)与后端服务器进行交互。Flex是Adobe开发的一种用于构建动态、交互性强的Web应用的开源框架,主要基于ActionScript...

    java通信学习-协议与加密

    在IT行业中,Java通信学习是开发者必须掌握的重要技能之一,特别是在构建分布式系统、网络应用或者进行数据传输时。本篇文章将聚焦于“协议与加密”这两个核心概念,它们是Java通信中的基石。以下是对这两个主题的...

    java通信程序参考

    Java通信程序设计主要涉及到网络编程的基本概念和技术,其中Socket是核心工具。Socket在Java中扮演着客户端和服务器之间通信的桥梁角色,它允许两台计算机通过Internet或局域网进行数据交换。在这个作业中,我们将...

    java读写Modbus RTU数据,java串口modbus通信,Modbus RTU与java通信 全开源

    最近在研究处理java写modbus RTU通信,分别使用几套工具,模拟modbus从站、模拟串口等才能正常在电脑测试成功。 全开源,放心下载 可以查看运行内容https://blog.csdn.net/weijia3624/article/details/121216539

    flex与java通信的完整demo

    Flex与Java通信是Web开发中的一个重要技术组合,它允许用户在浏览器端利用Flash的富互联网应用(RIA)特性,通过ActionScript与服务器端的Java应用程序进行数据交互。本压缩包包含了一个完整的Flex与Java通信的示例...

    java通信参考程序

    "java通信参考程序"是一个专为学习和理解Java通信机制而设计的实验项目。这个实验程序旨在帮助初学者和开发者了解如何在Java环境中实现不同节点之间的数据交换,这对于构建分布式系统、网络服务或客户端应用至关重要...

    最简单的BlazeDS实现flex与java通信.rtf

    最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的...

    flash+java通信例子

    本示例“Flash+Java通信例子”聚焦于如何利用Adobe Flash与Java应用程序之间进行数据交互。这两种技术结合,可以为用户提供丰富的交互式Web体验,特别是在多媒体、游戏和动态内容展示方面。 Flash是一款广泛应用于...

    java读写Modbus TCP UDP数据,java与modbus通信,Modbus TCP UDP与java通信 全开源

    java读写Modbus TCP UDP数据,java与modbus通信,Modbus TCP UDP与java通信 全开源 这是一个能正常通过Modbus TCP UDP协议读写项目 请放心下载,完全开源,在多个项目中已经使用

    Flex Java通信实例

    Flex Java通信实例主要探讨的是如何在Adobe Flex前端应用与Java后端服务器之间建立通信机制,以便实现数据交换和功能交互。Flex是一种开放源代码的框架,用于构建具有丰富用户界面的Web应用程序,而Java作为多平台...

    flex3 java 通信

    5. **Flash Remoting**:虽然不是Flex3与Java通信的首选方式,但Flash Remoting(通过NetConnection和NetStream类)仍然可用于与服务器端进行实时数据交换,不过它通常用于Flash Player而不是Flex。 6. **Security*...

    java通信代码大全

    Java通信代码大全主要涵盖的是如何在Java环境中实现各种网络通信技术。这涉及到一系列的技术和概念,包括TCP/IP协议、套接字编程、多线程、数据序列化等。以下是关于这些知识点的详细说明: 1. **TCP/IP协议**:TCP...

    JAVA通信协议框架Darks Codec 1.0.3

    它支持将JAVA对象与绝大部分基于字节的消息协议之间进行互相转换,以此协助开发人员便捷有效的快速构建消息协议,并为粘包、断包等问题提供了有效的解决方案。它能让开发人员从消息协议的实现中解脱出来,让其更多的...

    UnSigCom.rar_JAVA 通信_java 加密

    1. **Java通信**:Java提供了多种方式进行通信,包括但不限于RMI(远程方法调用)、JMS(Java消息服务)、Socket编程以及NIO(非阻塞I/O)。在给定的描述中,提到了“基于java的认证程序”,这可能涉及到使用Socket...

    Flex与Java实现通信

    #### 四、使用BlazeDS进行Flex与Java通信 完成上述步骤后,就可以开始使用BlazeDS进行Flex与Java之间的通信了。具体的通信流程包括: 1. **定义服务接口**:在Java中定义一个服务接口,该接口将被Flex应用程序调用...

    Flex与java通信源码

    Flex与Java通信是Web开发中的一个重要技术领域,它允许用户在浏览器端通过Flex客户端与后端Java服务器进行数据交互,实现动态、富交互性的应用程序。本源码可能包含了一个示例项目,展示了如何使用Flex与Java进行...

Global site tag (gtag.js) - Google Analytics