小弟我看不下去鸟.Java和C#的自定义socket通信协议真的简单吗

您现在的位置:&&>>&&>>&&>>&&>>&正文
java和C#之间SOCKET通信的问题
  java和之间SOCKET通信的问题
  一、端(使用java编写)
  * 监听客户端的请求
  private static void socketService()
  ExecutorService exec = Executors.newCachedThreadPool();
  ServerSocket server=new ServerSocket(5678);
  int i = 1;
  while(true)
  Log(log, null,"等待连接第"+i+"个用户...");
  Socket client=server.accept();
  Log(log, null,"第"+i+"个用户连接完成!");
  exec.execute(new PDAServerWithDB(client));
  catch(Exception whileExp)
  String msg = "多线程处理连接失败!";
  MyLogManager.ErrorLog(log, whileExp, msg);
  catch(IOException ioe)
  String msg = "连接失败!";
  MyLogManager.ErrorLog(log, ioe, msg);
  exec.shutdown();
  具体对于Socket信息的接受和发送在PDAServerWithDB类中处理
  信息处理分为:接收数据和发送数据
  服务端接收数据一律采用ReadLine()方法,这就要求客户端在发送请求时要有行结束符。
  的接收发送数据的代码
  a)构造输入输出流
  InputStream inPut = s.getInputStream();
  OutputStream outPut = s.getOutputStream();
  PrintWriter outWriter=new PrintWriter(outPut);
  BufferedReader inputReader =new BufferedReader(new InputStreamReader(inPut));
  b)接收客户端请求的代码
  String request = inputReader.readLine();
  request = request.trim();
  request = request.replaceAll("\n", "");
  c)向客户端发送文本数据的代码
  outWriter.println(strInfo);
  outWriter.flush();
  d)向客户端发送文件的代码
  // 发送文件长度
  File file = new File(filePath);
  byte[] outBytes = new byte[1024];
  int count = 0;
  FileInputStream fileInput = new FileInputStream(file);
  ByteArrayOutputStream ow = new ByteArrayOutputStream();
  while ((count = fileInput.read(outBytes)) & 0) {
  MyLogManager.DebugLog(log, null, String.valueOf(count));
  ow.write(outBytes, 0, count);
  outPut.write(ow.toByteArray());
  //outWriter.print(ow);//这个在JAVA客户端时可以正常响应,而在客户端中无法响应。
  //outWriter.flush();
  二、客户端(使用java和c#两个版本)
  1).发送请求信息(字符串格式)
  对于JAVA来说:直接使用PrintWrite类的println()方法即可。
  而对于来说:需要使用socket.Send(System.Text.Encoding.ASCII.GetBytes(msg + "\r"));需要在请求信息msg后面加上一个行结束标志符。
  2).接收数据(文本或者文件)
  2-1).java客户端接收数据
  a)java接收文本的代码示例:
  ******代码示例*****
  ("开始连接服务器");
  InetAddress address = InetAddress.getByName(AppConfig.IP);//193.100.100.143);
  SocketChannel sc = SocketChannel.open(new InetSocketAddress(address,AppConfig.PORT));
  ("服务器连接成功");
  //连接成功 初始化流
  InputStream inputStream = Channels.newInputStream(sc);
  InputStreamReader is = new InputStreamReader(inputStream,"GBK");
  in = new BufferedReader(is);
  ("接收服务器的数据");
  String responseLine="";
  while ((responseLine = in.readLine()) != null)
  //用readLine接收数据是,会自动抛弃换行符,如果为了保持数据的格式,需要在这里加上一个换行标识符
  returnStr += responseLine+"\n";
  ("接收服务器的数据完毕");
  **************
  b)java接收文件的示例代码:
  *****代码示例*****
  ("开始连接服务器");
  InetAddress address = InetAddress.getByName("193.100.100.159");//193.100.100.143);
  SocketChannel sc = SocketChannel.open(new InetSocketAddress(address,AppConfig.PORT));
  ("服务器连接成功,开始初始化流");
  //连接成功 初始化流
  OutputStream outputStream = Channels.newOutputStream(sc);
  InputStream inputStream = Channels.newInputStream(sc);
  InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
  byte[] b = new byte[1024];
  ByteArrayOutputStream bArrStream = new ByteArrayOutputStream(fileLength);
  int readCount = 0;
  while ((readCount = inputStream.read(b)) != -1)
【责编:ivy】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航12:17 提问
Java与C#用socket通讯
只求发送数据部分和数据接收部分(发送简单的文本信息)
只求发送数据部分和数据接收部分 TCP连接不要
客户端和服务器响应次数也不要
只求发送数据部分和数据接收部分(java发送c#接收)
按赞数排序
public void handleConnection(Socket connection) {
System.out.println("客户:" + connection.getInetAddress() + "在时间:" + Calendar.getInstance().getTime().toString() + "访问过!");
PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());
BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
System.out.println("111");
String read = streamReader.readLine();//如果客户端加入接收信息,就会停在这里不往下执行.
System.out.println("222");
System.out.println(read);
sun.misc.BASE64Decoder base64 = new sun.misc.BASE64Decoder();
read = new String(base64.decodeBuffer(read));
System.out.println("client said:" + read);
String msg = "login_ok";
streamWriter.write(msg);
streamWriter.flush();
streamWriter.close();
streamReader.close();
catch(FileNotFoundException e) {
e.printStackTrace();
catch(IOException e) {
e.printStackTrace();
public string sendLogin(string xml)
client = new TcpClient("127.0.0.1", 19999);
client.ReceiveTimeout = 1000;
client.SendTimeout = 2000;
ns = client.GetStream();
byte[] b = System.Text.Encoding.UTF8.GetBytes(Base64.Base64Code(xml));
ns.Write(b, 0, b.Length);
ns.Flush();
b = new byte[256];
//***********下行就是接收server返回信息,不加入的话server端就可以接收到这里发送的数据,加入的话server就一直处于等待读取client发送数据的状态,导致这里报错*************/
Int32 bytes = client.GetStream().Read(b, 0, b.Length);
//就是这句话出错,错误信息是“无法从传输连接中读取数据: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。。”
string responseData = System.Text.Encoding.UTF8.GetString(b, 0, bytes);
ns.Close();
client.Close();
return responseD
如果client不加入接收信息的话server端是可以正常执行的:
*********************************************
++++++ 客户请求成功 ++++++
客户:/127.0.0.1在时间:Fri Jul 31 10:41:55 CST 2009访问过!
client said:jfdklsjfldksjfsdklfjdsfjdsklfjskfjdslfkjfkdjfl
*******************************
如果client加入接收信息的话server端就一直停在读取信息上:
*********************************************
++++++ 客户请求成功 ++++++
客户:/127.0.0.1在时间:Fri Jul 31 10:41:55 CST 2009访问过!
*******************************
如果不是非要用Socket这种解决方案,可以试下用WCF,几种通讯服务都可以应付这个场景。
注意处理一下编码问题就行了,JAVA默认好像是utf-8
就是基本socket啊
其他相似问题java,C#客户服务端之Scoket通信
中间件实验要求实现在两种不同语言程序之间的通信,也就是客户端和服务端用两种不同的语言写,自然的就想到了.net和java平台,.net平台是跨语言的,java是跨平台的,因为java有JVM,只要机器上有装JVM,就可以跑java代码。之前写过一个聊天软件,也是通信方面的,所以,java和C#之间可以通过Scoket通信,也可以用文件方式,但是封装成文件方式后还是要通过socket传输数据啊。我想知道,除了socket外,还有没有其他方式的实现呢?
很惭愧,C#和java都学过了,但是都忘记了,甚至连一个java程序的modle都不知道什么是什么了。。。。于是就网上查资料了。。。
现在先回顾下C#socket编程吧:
服务器:Socket ServerSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
&&&&&&&&&&
string ip = "服务器ip地址";
&&&&&&&&&&&
IPAddress ipAddr = IPAddress.Parse(ip);
&&&&&&&&&&&
int port = 8000;
&&&&&&&&&&&
IPEndPoint ippoint = new IPEndPoint(ipAddr, port);
&&&&&&&&&&&
ServerSocket.Bind(ippoint);//绑定
ServerSocket.Listen(10);//监听
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
&&&&&&&&&&&&&&
int port = 8000;
&&&&&&&&&&&&&
IPAddress myIP = IPAddress.Parse("服务器ip地址");
&&&&&&&&&&&&&
IPEndPoint myClient = new IPEndPoint(myIP, port);
&&&&&&&&&&&&&&
sock.Connect(myClient);//连接服务器
java中Scoket编程步骤如下:
&& // 1. 创建socket
  ServerSocket ss = new ServerSocket(PortNumber);
  Socket s = ss.accept(); //监听器,产生阻塞,直到有连接才停止阻塞。
  // 2. 打开输入流、输出流
  OutputStream os = s.getOutputStream();
  BufferedOutputStream bos = new BufferedOutputStream(os);
  InputStream is = s.getInputStream();
  // 3. 根据一定的协议读写数据
  // 服务器 --& 客户(服务端向客服端写数据)
  //os.write("Hello,I am Server!".getBytes());
  bos.write("Hello,I am Server!".getBytes());
  bos.flush(); //注意!!
  // 服务器 &-- 客户(客服端向服务端写数据)
  byte[] buf = new byte[100];
  int len = is.read(buf);
  System.out.println(new String(buf, 0, len));
  // 4. 关系流和Socket
  //os.close();
  bos.close();
  is.close();
  s.close();
  ss.close();
  作为客户端则分为下面几个步骤,其实和服务端差不多,只是少了用ServerSocket进行监听。
  // 1. 创建socket
  Socket s = new Socket(InetAddress.getByName("localhost"),PortNumb
  注:测试时localhost最好是换成固定的IP地址。
  // 2. 打开输入流、输出流;
  OutputStream os = s.getOutputStream();
  InputStream is = s.getInputStream();
  // 3. 根据一定的协议读写数据
  // 客户&--服务器(服务端读数据)
  byte[] buf = new byte[100];
  int len = is.read(buf);
  System.out.println(new String(buf, 0, len));
  // 客户--&服务器(客服端读数据)
  os.write("Hello,I am Client!".getBytes());
  // 4. 关系流和Socket
  os.close();
  is.close();
  s.close();
问题是,java和C#的socket编程思想是一样的,就是要监听一个端口,有连接就创建一个socket!
但是难道java和c#的socket之间就能直接通信了么?
注意的是 发送和接收的时候的格式要统一
发送的时候需要:dos.write(message.getBytes("UTF-8"));发送UTF-8格式的二进制数据流。
接收字符串:然后再new一次 注意相应的格式这里使用UTF-8格式:
dis.read(b,0, b.length);
String stri=new String(b,"UTF-8");
(以下代码差不多来自)
下面是java服务端写的代码:
import java.io.*;
import java.net.*;
& public class Server {
&&private DataOutputStream
&&private DataInputStream
&&public boolean sendMsg(String
&&&dos=new
DataOutputStream(client.getOutputStream());
&&&dos.write(flag.getBytes("UTF-8"));
//发送的也是字节流,C#那端接收的也是字节流
&&&dos.flush();
&&&} catch
(IOException e) {
&&public String getMsg()
byte[]& b=new byte[1024];
message="";
DataInputStream(client.getInputStream());
&&&dis.read(b,0,
b.length);
&&&message=new
String(b,"UTF-8"); //关键!接收的是字节流,要转换为字符串才显示
&&&} catch
(IOException e) {
&&&e.printStackTrace();
message.trim(); //去掉空格
public& void test() throws IOException{
&&& ServerSocket
server = new ServerSocket(8895);
while(true)
client = server.accept();
sendMsg("已经和服务器连接上。");
dos.flush();
while(true)
String str = getMsg();
System.out.println(str.trim());
if(str.trim().equals("end"))&&&&&
sendMsg("准备服务器断开连接。");
dos.flush();
sendMsg("has receive....");
dos.flush();
client.close();
以下是C#实现的客户端代码:
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.Net.S
using System.N
using System.T
namespace DocNetclient
&&& public
partial class Form1 : Form
public Form1()
&&&&&&&&&&&
InitializeComponent();
private void Form1_Load(object sender, EventArgs e)
&&&&&&&&&&&
connetServer();
//通过winForm建立一个socket
public void connetServer()
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
&&&&&&&&&&&&&&&
int port = 8895;
&&&&&&&&&&&&&&&
IPAddress myIP = IPAddress.Parse("127.0.0.1");
&&&&&&&&&&&&&&&
IPEndPoint myClient = new IPEndPoint(myIP, port);
&&&&&&&&&&&&&&&
sock.Connect(myClient);//连接服务器
&&&&&&&&&&&
&&&&&&&&&&&
catch (Exception ey)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
MessageBox.Show(ey.Message);
&&&&&&&&&&&
//获取消息
private string getMsg()
&&&&&&&&&&&
string strInfo = string.E
&&&&&&&&&&&
byte[] receiveByte = new byte[1024];
&&&&&&&&&&&
sock.Receive(receiveByte, receiveByte.Length, 0);
&&&&&&&&&&&
strInfo = Encoding.UTF8.GetString(receiveByte);//字节流转换为字符串
&&&&&&&&&&&
return strI
//然后是发送信息函数:
private void SendToChart(string str)
&&&&&&&&&&&
Byte[] sendByte = new Byte[1024];
&&&&&&&&&&&
sendByte = Encoding.UTF8.GetBytes(str.ToCharArray());
&&&&&&&&&&&
sock.Send(sendByte, sendByte.Length, 0);//发送字节
&&&&&&&&&&
&以上只是实现了简单的通讯功能,没有考虑到并发问题,若要并发可以设置多线程来解决。也就是对于每个
客户端,服务器新建一个线程来维持它们的通信,而服务器继续监听。(那可不可以多进程阿?)
java代码实现见:
(有时间的话C#和java都再动手做一遍!)
疑问:InetAddress.getLocalHost(),得到的是什么地址?服务器还是客户端的 ???
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 socket通信 的文章

 

随机推荐