socket客户端怎么接受服务器传过来的java类数据包

我通过服务器向客户端传了一个java类,不知道怎么接受,不想把这个java类中的数据放到数组中传。目前只会发送一个字符串,然后可以接收字符串。

3个回答

图片说明,java类是这样的

字符串都可以发送过去,一个Java对象也是一样的啊。凡是通过套接字网络传输的数据,都是用流

qq_34789262
wuming无名 回复ljheee: 我接收的时候,试了好多函数都不行,请问下具体怎么来接,网上找了下都是纸上谈兵
3 年多之前 回复

Java对象序列化后通过socket发送后,接收端可以直接反序列化为Java对象就可以了,至于怎么发送接收可疑搜索看下基本用法 。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
JAVA的Socket为什么会自动关闭。跪了,求解
问题描述: 这里有一个服务器和一个带图形界面客户端。当的用户账号密码正确时,客户端会向服务器提出连接请求,也就是new Sicket(..., ...); 可是为什么客户端这个Socket会在成功连接7秒左右自动关闭。 我判断客户端的Socket已经关闭的原因有两个。 1.客户端的socket不停调用s.sendUrgentData方法,但在运行7秒左右时会抛出异常。 2 服务器一直在等待客户端的消息,但是在运行7秒左右服务器却抛出connection reset异常,在抛异常之前客户端可以正常发送数据,异常之后不能再发送了,在百度上知道这是因为发送方(也就是客户端)的socket已经关闭,而接收方还在等待接受而抛出的异常。 相关代码: // 客户端代码 public class LoginFrame extends JFrame { private Socket s ; if (log()) { // log是连接数据库的函数,会返回boolean表示用户名密码对不对 s = Client.requst(nameTF.getText()); // 为s赋值,将返回的Socket保存在s中, 类的静态方法requst } else { System.out.println("登陆失败"); } } // 主函数 public static void main(String[] args) throws InterruptedException { LoginFrame f = new LoginFrame(); Thread.sleep(2000);// 为了给输入用户名和密码时间 while (true) { try { f.s.sendUrgentData(0xFF); System.out.println("发送成功"); } catch (IOException e) { System.out.println("因发送心跳包出现异常" + e.getMessage()); break } } } // 客户端的连接请求代码 public class Client { public static Socket requst(String name) { Socket s = null; try { // 发出连接请求 s = new Socket("127.0.0.1", 8888); PrintWriter writer = new PrintWriter(s.getOutputStream()); // 告诉服务器是谁刚刚连接 writer.write(name + "\n"); writer.flush(); } catch (UnknownHostException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } return s; } 相关截图 客户端异常 ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560659211_996428.jpg) 服务器异常(提问时,异常变成这个,但之前都是Connection reset) ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560659224_174504.jpg) 请各位朋友帮忙了。 这次是JAVA课程设计,但老师并没有讲Socket,Socket的一些细节我也不清楚。所以拜托了帮我找找Bug。 ---------------------------------------------------------------------- 各位我实在是充不起C币。 要是问题解决了, 你支付宝二维码或者微信发过来, 我给你6块行不行。 拜托了,帮帮我吧。
java定时器超时后关闭socket出现socket closed 异常的问题
package my.start; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Timer; import java.util.TimerTask; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; //创建AutoStart类,让他实现ServletContextListener(服务程序上下文监听器)接口 //实现ServletContextListener接口需要重写contextDestroyed()和contextInitialized()两个方法 //记得要在web.xml文件中加入 // <listener> // <listener-class>my.test.AutoStart</listener-class> // </listener> //这样,tomcat在启动时,就会同时调用该接口的contextInitialized()方法 //在contextInitialized()方法中,开启一个线程,用soket监听一个端口,从而实现TCP通信 public class AutoStart extends HttpServlet{ private static final long serialVersionUID = 1L; private int soketPort = 9014;//要监听的服务器端口,可以根据需要进行修改 @Override public void init() throws ServletException { // TODO Auto-generated method stub super.init(); new MyThread().start();//创建一个MyThread线程对象,并启动线程 System.out.println("开启监听线程"); } //创建MyThread类,继承Thread方法 class MyThread extends Thread { //重写Thread类的run()方法,用来实现MyThread线程的功能 public void run() { //System.out.println("测试开始"); try { ServerSocket ss = new ServerSocket(soketPort); System.out.println("监听到"+(soketPort+"")+"端口"); while(true){ //System.out.println("已经创建soket"); //ss对象的accept()方法可以监听指定端口有没有TCP连接 //在没有TCP连接之前程序将阻塞在这里 Socket socket = ss.accept(); System.out.println("有客户端接入"); //监听到指定端口有TCP连接后,创建soket对象,程序不再堵塞,往下执行 //创建一个线程,去监听客户端通过TCP发来的数据 Thread sockThread=new SocketTherad(socket); //启动线程 sockThread.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } int timeNum; class SocketTherad extends Thread{ //继承Thread类来创建线程 Socket socket; InputStream is; OutputStream os; boolean run_flag=true;//控制run()函数是否继续运行标志位 Timer heartBeatTimer = new Timer(); //心跳包定时器 private void startHeartBeatThread() { TimerTask heartBeatTask = new TimerTask() { public void run() { timeNum++; System.out.println("timerNum="+(timeNum+"")); if(timeNum==2){//超时则关闭socket连接及定时器 try { is.close(); os.close();//关闭输出流 socket.close();//关闭soket run_flag=false;//跳出死循环 System.out.println("TCP连接断开"); heartBeatTimer.cancel();//关闭定时器 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; heartBeatTimer.schedule(heartBeatTask, 10*1000, 10*1000); } public SocketTherad(Socket socket) { this.socket = socket;//传递过来的soket参数赋予给socket对象 } public void run() {//run()函数用来实现线程要完成的任务 startHeartBeatThread(); while(run_flag) { try { String str = null; is = socket.getInputStream();//获取输入流 os=socket.getOutputStream(); byte[] buffer = new byte[200];//数据缓冲区; int length=0; length = is.read(buffer);//读取接收到的数据流长度 if(length != (-1)){//不是-1,说明读取到有效的数据 str = new String(buffer,0,length);//输入流转换成str字符串 System.out.print("收到数据:"); System.out.println(str); } else if(length == (-1)){//接收到数据长度为-1,说明客户端主动关闭了TCP连接 is.close();//关闭输入流 os.close();//关闭输出流 socket.close();//关闭soket run_flag=false;//跳出死循环 System.out.println("TCP连接断开"); } buffer = null; System.gc();//垃圾回收 } catch (IOException e) { e.printStackTrace(); } } } } } ``` ```
一个悲催的菜鸟,关于安卓socket传输手机蓝牙地址的问题。。。
最近做一个项目,是关于用安卓编程获取手机的蓝牙地址,并且把获取的蓝牙地址通过socket传输到服务器端,真的很急,希望大神能够帮忙解决,一个悲催的工科妹子在此谢过了。。。 client: package Socketprocess; import java.net.*; import java.io.*; public class Client{ public void getadd() { } public static void main(String[] args) throws Exception{ Socket s = new Socket("10.129.165.146",8899); DataOutputStream dos = new DataOutputStream(s.getOutputStream()); //获取Socket对象的输出流,并且在外边包一层DataOutputStream管道,方便输出数据 Thread.sleep((int)(Math.random()*3000)); //让客户端不定时向服务器发送消息 dos.writeUTF("客户端"); //DataOutputStream对象的writeUTF()方法可以输出数据,并且支持中文 dos.flush(); //确保所有数据都已经输出 dos.close(); //关闭输出流 s.close(); //关闭Socket连接 } } clientachieve: package Socketprocess; import java.io.DataInputStream; import java.net.Socket; public class Clientacheive implements Runnable{ int clientIndex = 0; //保存客户端id Socket s = null; //保存客户端Socket对象 Clientacheive(int i,Socket s){ clientIndex = i; this.s = s; } public void run(){ //打印出客户端数据 try{ DataInputStream dis = new DataInputStream(s.getInputStream()); System.out.println("第" + clientIndex + "个客户端发出消息:" + dis.readUTF()); dis.close(); s.close(); } catch(Exception e) {} } } server: package Socketprocess; import java.net.*; //import java.io.*; public class TCPServer{ public static void main(String[] args) throws Exception{ ServerSocket ss = new ServerSocket(9988); //创建一个Socket服务器,监听5566端口 int i=0; //利用死循环不停的监听端口 while(true){ Socket s = ss.accept();//利用Socket服务器的accept()方法获取客户端Socket对象。 i++; System.out.println("第" + i +"个客户端成功连接!"); Clientacheive c = new Clientacheive(i,s); //创建客户端处理线程对象 Thread t =new Thread(c); //创建客户端处理线程 t.start(); //启动线程 } } } client部分是打算放到安卓手机上运行的。。。如果能够有解答,真心感激不尽了!
Java 网络通信 类还未编写如何进行调用(或者解决思路)
程序想实现的效果:客户端现在有一个对象“狗”,加入了一个LinkedList集合,随后将该集合发送到服务器端。服务器端接收到这个集合,会调用一个方法Judge来判断LinkedList里面有什么,如果是狗则调用XXX方法,如果是猫则调用XXX方法。 问题描述:现在客户端与服务器端单独抽出成为一个jar工具包。也就是说服务器端和客户端会预先写好。换而言之,在该包里没有Judge方法,Judge方法是在程序实际编写时再写成的。那么此时服务器端代码应该怎么写? 实际应用举例:当实际使用时,应用程序(客户端)调用Send(),此时该jar包中已编好的程序会将对象发送到服务器端;在服务器端只需写一个Judge(),该方法会被jar包中的程序自动调用。 大体实现的代码: 客户端: ``` //向服务器发送数据 public void send(TransferLinkedList linkedList) throws IOException{ /** * 本方法用于客户端向服务器发送数据。首先从套接字中获取基本输出流,接下来将该输出流转换为对象输出流以输出对象 */ //从该套接字中获取输出流 OutputStream clientOut = client.getOutputStream(); //将该输出流处理为对象输出流 ObjectOutputStream clientOutObject = new ObjectOutputStream(clientOut); //传输信息 clientOutObject.writeObject(linkedList); //刷新缓存区 clientOutObject.flush(); //接收服务器信息以确认是否成功发送信息 } ``` 服务器端: ``` //开始运行 public void run() throws IOException{ //服务器一直等待客户端的连接,当与客户端建立连接时,服务器分出一个线程建立新的Socket进行处理,原有Socket继续等待 //此处为了简便省略线程 while(true){ Socket socket = server.accept(); //处理新的Socket /** * 调用Judge方法,Judge方法应在实际使用该jar包时编写 * 此时不知道Judge包含哪些方法,是怎么样的路径,甚至名字是否是Judge * 该使用什么方法来处理?反射?工厂模式?感觉都不大能解决 */ } } ```
java map创建以后,能保留多久呢,生命周期有限制吗?
在做一个功能,socket服务器把接入的客户端socket都存入一个map里面保存,建立长连接, 有数据需要发送到客户端的时候就直接从map里调出这个客户端的socket发送数据给它。 所以在想一个问题,我服务器端创建的这个map可以保存多久呢?会不会过一段时间就被清理掉了?我也不想存在文件里,那样可能会比较慢吧,而且根据客户端的心跳包随时保持 长连接,随时都要遍历map,看是否心跳被更新,如果没有心跳就要从map里去掉这个socket。 所以想请教一下大家,map的生命周期是多久啊?(之前在servlet里,用了一个application来保存map,application肯定是随服务器一直存在,当时map本身是否有周期呢?) 谢谢大家了
关于Socket中的数据流获取
诚心请教,这段时间在做一个项目,一个GPRS的数据中心。GPRS终端通过Internet将数据传输至数据中心。所以我设想通过Socket去实现通讯。在做model的时候却出现了一个问题。我获取的一段心跳数据出现了错误,做数据比对是用十六进制的形式进行比对的(源数据是十六进制)。代码如下,不知道我错在什么地方请各位指点。[code="java"] private BufferedReader getReader(Socket socket) throws IOException { InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); }[/code] [code="java"] in= getReader(connection); String str=""; while((str=in.readLine())!=null){ System.out.println("has receive...."); System.out.println("收到原码:"+str); System.out.println("转换为16:"+ String2Hex(str)); if(str.equals("end")) break; } connection.close(); }[/code] 转换成16进制的代码如下: [code="java"] public static String String2Hex(String s){ String str = ""; for(int i=0;i<s.length();i++){ int ch = s.charAt(i); String ss = Integer.toHexString(ch); str = str + ss; } return str.toUpperCase(); } [/code] 我自己分析了一下,但是不知道我的分析是否正确。我分析是在获取Socket的流时候就已经出现了错误,也就是 [code="java"] InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); [/code] 所以str=in.readLine()就已经是一列错误的字符串了 [code="java"]该心跳包正确的16进制串为:6831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A16 我解析的为:68310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a16 [/code] [b]问题补充:[/b] 感谢megcker 但是问题还是没有解决啊 期待 [b]问题补充:[/b] 6831031068fffd727077026000106a16 这是我使用megcker提供的方法解析出来的前部分 [b]问题补充:[/b] tfqjavaeye 说的这个控制字符没有读取出来的信息是一种思考的方向。但却不是做了((str=in.readLine())!=null)这个判断的原因。当我不用这个判断直接读取以后就转换也还是一样的缺少0 [b]问题补充:[/b] 以上解释出来的用的是[code="java"]DataInputStream dis = new DataInputStream(connection.getInputStream()); //BufferedReader streamReader = getReader(connection); System.out.println("服务器接收到客户端的连接请求:" + String2Hex(dis.readLine())); [/code] 解析出来的为::68310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a16 我在[url]http://www.leftworld.net/online/j2sedoc/javaref/java.io.datainputstream_dsc.htm#readUTF(java.io.DataInput)[/url]这里发现一段话 数据输入流和数据输出流以稍加修订的 UTF-8 格式表示 Unicode 字符串。 。。。。。。 这种格式与“标准的”UTF-8 格式的区别如下: Null 字符 '\u0000' 用两个字节而不是一个字节格式编码,所以编码后的字符串永不会包含空字符。 不是到是不是因为他编码后的字符串不包含空字符才会导致 我在解析出来的数据中缺少0 也就是tfqjavaeye说的 [b]问题补充:[/b] 问题已经解决了 dwangel 的说法很正确啊 一直都只盯着流 却忽略了这里 多谢各位了
关于rpc的一点疑惑、为什么需要rpc?
网上的解答是 : rpc的目的 就是通过像调用本地服务一样远程调用另一台服务器上的服务来完成需求。 我的理解就是调用这个远程服务的目的就是获取一个返回结果,然后客户端拿到这个结果再做相关的操作,那么问题来了,为什么不直接调用一个http的接口呢,将参数通过get或者post来传递,这样可以获取到相应的结果啊。又或者通过socket直接发送数据包来请求服务,然后服务端通过不同的数据包来执行不同的服务。 那么rpc的好处体现在哪里呢=_=
socket connection resect
我写了一个传送报文的socket,正常情况下服务器端和客户端都没有问题,但是只要客户端在报错,服务器端就会报connection reset,理论上客户端的操作应该对服务器端没有影响才对啊 server [code="java"] package Work; import java.io.*; import java.net.*; import java.util.HashMap; public class SocketAPIServer extends Thread { /** * 报文拆解 返回报文体中的字段 * * @param rspPkgStr * 返回报文 * @return * @throws Exception */ public static HashMap<String, String> dissolveRspPkgBodyStr(String rspPkgStr) throws Exception { HashMap<String, String> hashMap = new HashMap<String, String>(); String sbody = rspPkgStr.substring(65); String[] abody = sbody.split("\\|"); for (int i = 0; i < abody.length; i++) { String sPair = abody[i]; String[] aPair = sPair.split("="); if (aPair.length == 2) { hashMap.put(sPair.split("=")[0], sPair.split("=")[1]); } else { hashMap.put(sPair.split("=")[0], ""); } } return hashMap; } /** * 报文拆解 返回报文头中的字段 * * @param rspPkgStr * @return * @throws Exception */ public static HashMap<String, String> dissolvePkgHeadStr(String rspPkgStr) throws Exception { HashMap<String, String> hashMap = new HashMap<String, String>(); String shead = rspPkgStr.substring(0, 65); hashMap.put("报文长度", shead.substring(0, 5)); // 0-5_报文长度 hashMap.put("ID号", shead.substring(5, 11)); // 6-11_ID号 hashMap.put("固定'0000'", shead.substring(11, 15)); // 12-15_固定"0000" hashMap.put("交易码", shead.substring(15, 25)); // 16-25_六个字符串的交易码 hashMap.put("客户经理号", shead.substring(25, 33)); // 26-33_客户经理号 hashMap.put("空格_01", shead.substring(33, 54)); // 34-54_空格 hashMap.put("空格_02", shead.substring(54, 65)); // 55-64空格 return hashMap; } /** * 建立socket连接,监听端口 * * @return */ public void run() { ServerSocket serverSocket = null; PrintWriter out = null; BufferedReader in = null; try { // 实例化监听端口 serverSocket = new ServerSocket(8888); } catch (IOException e) { System.err.println("Could not listen on port: 8888."); System.exit(1); } Socket incoming = null; try { while (true) { try { incoming = serverSocket.accept(); out = new PrintWriter(incoming.getOutputStream(), true); // 先将字节流通过 InputStreamReader 转换为字符流,之后将字符流放入缓冲之中 in = new BufferedReader(new InputStreamReader(incoming .getInputStream())); } catch (IOException e) { e.printStackTrace(); } // 提示信息 out.println("Hello! . . . "); out.flush(); // 没有异常的情况不断循环 while (true) { // 只有当有用户输入的时候才返回数据 String str = in.readLine(); // 当用户连接断掉时会返回空值 null if (str == null) { // 退出循环 break; } else { StringBuffer strh = new StringBuffer(); StringBuffer strb = new StringBuffer(); HashMap<String, String> mapHead = dissolvePkgHeadStr(str); for (String key : mapHead.keySet()) { strh.append(key); strh.append("="); strh.append(mapHead.get(key)); } HashMap<String, String> mapBody = dissolveRspPkgBodyStr(str); for (String key : mapBody.keySet()) { strb.append(key); strb.append("="); strb.append(mapBody.get(key)); } String str1 = strh.toString(); String str2 = strb.toString(); // 对用户输入字串加前缀 Echo:,将此信息打印到客户端 out.println("Echo: " + str); System.out.println("收到信息:"+str); //打印包头 for (String keyHead : mapHead.keySet()) { System.out.println(keyHead+"="+mapHead.get(keyHead)); out.println(keyHead+"="+mapHead.get(keyHead)); } //打印包体 for (String keyBody : mapBody.keySet()) { System.out.println(keyBody+"="+mapBody.get(keyBody)); out.println(keyBody+"="+mapBody.get(keyBody)); } out.println(str1); out.println(str2); out.flush(); } } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) throws IOException { Thread thread = new SocketAPIServer(); thread.setDaemon(true); thread.start(); while (true) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); return; } } } } [/code] client [code="java"] package Work; import java.io.*; import java.net.*; import java.util.HashMap; // 客户端程序 public class SocketAPIClient { /** * 输入报文头 * * @return str 报文头 */ public static String inputPkgHead() throws IOException { System.out.println("请输入报文长度"); String str1 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); System.out.println("请输入ID号"); String str2 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); System.out.println("请输入固定'0000'"); String str3 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); System.out.println("请输入交易码"); String str4 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); System.out.println("请输入客户经理号"); String str5 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); String str = str1 + "," + str2 + "," + str3 + "," + str4 + "," + str5; return str; } /** * 追加一定数目的空格到字符传尾,使其符合特定的长度 * * @param s * 原始字段 * @param len * 定义长度 * @return */ private static String tailPad2Str(String s, int len) { int length = 0; if (s == null) { s = ""; } try { length = s.getBytes("gb18030").length; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (length > len) { throw new IllegalArgumentException("STRING TOO LONG ..."); } StringBuffer buffer = new StringBuffer(); buffer.append(s); for (int i = 0; i < (len - length); i++) { buffer.append(' '); } return buffer.toString(); } /** * 根据 流水ID, 交易码 生成报文头 * * @param seqNo * @param tradeCode * @return * @throws IOException */ public static String composePkgHeadStr() throws IOException { StringBuffer buffer = new StringBuffer(); String t = inputPkgHead(); String[] s = t.split(","); buffer.append(tailPad2Str(s[0], 6)); // 0-5_报文长度 buffer.append(tailPad2Str(s[1], 6)); // 6-11_ID号 buffer.append(tailPad2Str(s[2], 4)); // 12-15_固定"0000" buffer.append(tailPad2Str(s[3], 10)); // 16-25_六个字符串的交易码 buffer.append(tailPad2Str(s[4], 8)); // 26-33_客户经理号 buffer.append(tailPad2Str("", 21)); // 34-54_空格 buffer.append(tailPad2Str("", 10)); // 55-64空格 return buffer.toString(); } /** * 生成报文体字符串 * * @param kcoll * @return * @throws IOException */ public static String composePkgBodyStr() throws IOException { StringBuffer buffer = new StringBuffer(); HashMap<String, String> map = new HashMap<String, String>(); // 输入报文体 while (true) { System.out.println("请输入Key"); String str1 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); System.out.println("请输入Value"); String str2 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); map.put(str1, str2); System.out.println("输入'ENTER'提交或回车继续输入"); String str3 = new BufferedReader(new InputStreamReader(System.in)) .readLine(); // 退出命令,equalsIgnoreCase() 是不区分大小写的比较 if (str3.trim().equalsIgnoreCase("ENTER")) break; } if (map == null || map.size() == 0) { throw new IllegalArgumentException("PKG BODY IS EMPTY .."); } else { for (String key : map.keySet()) { buffer.append(key); buffer.append("="); buffer.append(map.get(key)); buffer.append("|"); } } return buffer.toString(); } public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try { echoSocket = new Socket("localhost", 8888); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(echoSocket .getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: localhost."); System.exit(1); } System.out.println(in.readLine()); String userInput = composePkgHeadStr() + composePkgBodyStr(); // 将客户端 Socket 输入流(既服务器端 Socket 的输出流)输出到标准输出上 out.println(userInput); System.out.println(in.readLine()); System.out.println(in.readLine()); System.out.println(in.readLine()); System.out.println(in.readLine()); out.close(); in.close(); System.out.println("输入'CLOSE'断开连接"); String strClose = new BufferedReader(new InputStreamReader(System.in)) .readLine(); // 退出命令,equalsIgnoreCase() 是不区分大小写的比较 if (strClose.trim().equalsIgnoreCase("CLOSE")) echoSocket.close(); } } [/code]
mina udp 客户端收不到服务端消息
已经关闭防火墙,抓包工具可以监听到服务端已经发送了消息 客户端代码 package cn.encdata.service.signal.realtime.client; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioDatagramConnector; import org.apache.mina.transport.socket.nio.NioSocketConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.encdata.service.Config; //通信客户端 public class SocketClient { private ConnectFuture future = null;//连接对象 private boolean exit = false; private static Charset CS = Charset.forName("GBK"); private IoSession session = null;//会话 private static Logger log = LoggerFactory.getLogger(SocketClient.class); private static SocketClient client= null; private SocketClient() { } public static SocketClient instance() { if(client == null) { client = new SocketClient(); } return client; } public synchronized void start() { new Thread(new Runnable(){ public void run(){connect();} }).start(); } public synchronized void stop() { if(future!=null && future.isConnected()) { future.getSession().close(true); future = null; exit = true; } } public synchronized void send(IoBuffer buffer) { if(buffer == null) return; if(session == null || !session.isConnected()) { log.info("通讯链路尚未创建,无法发送数据."); return; } if(session.getAttribute("login") == null) { log.info("通讯链路尚未通过验证,无法发送数据."); return; } session.write(buffer); buffer.free(); } private void connect() { while(!exit) { if(future == null || !future.isConnected()) { IoConnector connector = null; try { connector = new NioDatagramConnector(); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory())); //connector.setConnectTimeoutMillis(Config.Server.ConnectTimeout); connector.setHandler(new SocketDataHandler()); future = connector.connect(new InetSocketAddress("172.16.13.99",5555),new InetSocketAddress("172.163.133.200",8341)); future.awaitUninterruptibly(); if (!future.isConnected()) { log.info(" 断线连接中{}:{}",Config.Server.IP,Config.Server.Port); Thread.sleep(Config.Server.ReconnectInterval); continue; } session = future.getSession(); future.getSession().getCloseFuture().awaitUninterruptibly(); future = null; } catch (Exception e) { log.error("创建通讯连接异常",e); break; } finally { if(connector != null) { connector.dispose(); } } } try { Thread.sleep(Config.Server.ReconnectInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } } handler类代码为: package cn.encdata.service.signal.realtime.client; import java.nio.ByteOrder; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.encdata.service.Config; import cn.encdata.service.signal.realtime.receive.handler.FaceHandler; public class SocketDataHandler extends IoHandlerAdapter { private final Logger log = LoggerFactory.getLogger(SocketDataHandler.class); @Override public void sessionOpened(IoSession session) { log.info("与服务器连接成功:"+session.getRemoteAddress()); log.info("发送登录消息"); //退出登录 //session.write("退出登录\rsuper\r"); session.write("登录系统\rsuper\r111\r"); } @Override public void sessionClosed(IoSession session) throws Exception { log.info("{}与服务器断线",session.getRemoteAddress()); } @Override public void messageReceived(IoSession session, Object message) { System.out.println("客户端传来消息:"+message.toString()); } @Override public void sessionIdle(IoSession session, IdleStatus status) { if (status == IdleStatus.BOTH_IDLE) { //发送心跳包 IoBuffer heartbeat = IoBuffer.allocate(2+1); heartbeat.order(ByteOrder.BIG_ENDIAN); //heartbeat.putUnsignedShort(1); //heartbeat.putUnsigned(0); //heartbeat.flip(); log.info("发送心跳消息"); session.write("客户端正常\rsuper\r"); } } @Override public void sessionCreated(IoSession session) throws Exception { //当创建一个新的连接时被触发,即开始一个新的session是被触发 log.info("sessionCreated"); session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 20); } @Override public void messageSent(IoSession session, Object message) { } @Override public void exceptionCaught(IoSession session, Throwable cause) { log.error(cause.getMessage(),cause); } }
JavaWeb上传文件内存问题
问题一:JavaWeb上传文件后(几个20,30M)然后插入到数据库中,内存升高。上传完毕后,内存不会释放,内存还是那么高。用360一键加速后内存降低。有什么办法可以让上传完后就立刻释放内存? 问题二:JavaWeb上传的一个类DiskFileItemFactory(commons.fileupload包的)设置了缓存大小和临时目录,内存还是这么高,这是为什么? 问题三:用Socket传输文件(几个20,30M),服务器端想数据库获取文件,然后发送给客户端。使用对象输入输出流来发送(多个文件还有其他信息,不会用字节流读取,所以用对象流)内存升高,传输完后为什么内存不释放,怎么让内存释放?让内存升高的是从数据库获取的操作还是用Socket传输的操作?
pgjdbc数据库的ssl证书验证源码有几点不懂的地方
postgresql 数据库用证书验证,看了一下源码,但是ssl证书验证有几点不懂的地方. 下面是pgjdbc获取完数据库的连接后, 开始启用ssl证书验证的流程. 我的问题: 过程我都看明白了, 但是不知道为什么它要这么做, 还是说这是个标准, 有人可以帮我讲解一下,或者给点资料参考也行, 谢谢 为了保持代码的简洁性,代码有删减. ``` private PGStream enableSSL(PGStream pgStream, SslMode sslMode, Properties info, int connectTimeout) throws IOException, PSQLException { // 发送SSL请求包 pgStream.sendInteger4(8);//发送一个4字节的整数到后端。 pgStream.sendInteger2(1234);//发送一个2字节整数(短)到后端。 pgStream.sendInteger2(5679); pgStream.flush();//将任何挂起的输出刷新到后端。 // Now get the response from the backend, one of N, E, S. 现在从后端(N, E, S)中获取响应。 int beresp = pgStream.receiveChar();//从后端接收单个字符。 switch (beresp) { case 'S': // ssl 服务器支持ssl **org.herodbsql.ssl.MakeSSL.convert(pgStream, info);** return pgStream; } } ``` 上面可以看到,jdbc给数据库发了几个字节的整数, 然后获取响应,走不同的switch,但是不知道为什么这么做,接着进去看,convert方法 ``` public static void convert(PGStream stream, Properties info) throws PSQLException, IOException { LOGGER.log(Level.FINE, "converting regular socket connection to ssl"); **SSLSocketFactory factory = SocketFactoryFactory.getSslSocketFactory(info);** SSLSocket newConnection; // 将常规套接字连接转换为ssl newConnection = (SSLSocket) factory.createSocket(stream.getSocket(), stream.getHostSpec().getHost(), stream.getHostSpec().getPort(), true); // 我们必须手动调用,否则将隐藏异常 newConnection.setUseClientMode(true);// 设置使用客户端模式 newConnection.startHandshake();// 开始握手 stream.changeSocket(newConnection); } ``` 在看SocketFactoryFactory.getSslSocketFactory(info); ``` public static SSLSocketFactory getSslSocketFactory(Properties info) throws PSQLException {//获取Ssl套接字工厂 String classname = PGProperty.SSL_FACTORY.get(info);// 获取要使用的SSL工厂的类名 if (classname == null || "org.herodbsql.ssl.jdbc4.LibPQFactory".equals(classname) || "org.herodbsql.ssl.LibPQFactory".equals(classname)) { return new LibPQFactory(info); } } ``` 接着看 new LibPQFactory(info); 这个方法应该就是加载证书的地方 ``` public LibPQFactory(Properties info) throws PSQLException { try { SSLContext ctx = SSLContext.getInstance("TLS"); // or "SSL" ? // 确定默认文件位置 String pathsep = System.getProperty("file.separator");// 获取windows或者linux的文件夹分隔符 String defaultdir; boolean defaultfile = false; if (System.getProperty("os.name").toLowerCase().contains("windows")) { // It is Windows defaultdir = System.getenv("APPDATA") + pathsep + "herodbsql" + pathsep; // 获取指定环境变量的值。环境变量是一个依赖于系统的外部命名值。 } else { defaultdir = System.getProperty("user.home") + pathsep + ".herodbsql" + pathsep; } // Load the client's certificate and key 加载客户机的证书和密钥 String sslcertfile = PGProperty.SSL_CERT.get(info); if (sslcertfile == null) { // Fall back to default 退回到默认状态 defaultfile = true; sslcertfile = defaultdir + "herodbsql.crt"; } String sslkeyfile = PGProperty.SSL_KEY.get(info); if (sslkeyfile == null) { // Fall back to default defaultfile = true; sslkeyfile = defaultdir + "herodbsql.pk8"; } // Determine the callback handler 确定回调处理程序 CallbackHandler cbh; String sslpasswordcallback = PGProperty.SSL_PASSWORD_CALLBACK.get(info); if (sslpasswordcallback != null) { try { cbh = (CallbackHandler) ObjectFactory.instantiate(sslpasswordcallback, info, false, null); } catch (Exception e) { throw new PSQLException( GT.tr("The password callback class provided {0} could not be instantiated.", sslpasswordcallback), PSQLState.CONNECTION_FAILURE, e); } } else { cbh = new ConsoleCallbackHandler(PGProperty.SSL_PASSWORD.get(info));// 获取 sslkey的加密密码 } // If the properties are empty, give null to prevent client key selection 如果属性为空,则为null,以防止选择客户机密钥 km = new LazyKeyManager(("".equals(sslcertfile) ? null : sslcertfile), ("".equals(sslkeyfile) ? null : sslkeyfile), cbh, defaultfile);//创建lazykeymanagerduixinag TrustManager[] tm; SslMode sslMode = SslMode.of(info); if (!sslMode.verifyCertificate()) { // server validation is not required 不需要服务器验证 tm = new TrustManager[]{new NonValidatingTM()}; } else { // Load the server certificate 加载服务器证书 TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");// 创建证书信任管理器工厂 KeyStore ks; try { ks = KeyStore.getInstance("jks");// 读取秘钥是所需要用到的工具类 } catch (KeyStoreException e) { // this should never happen throw new NoSuchAlgorithmException("jks KeyStore not available"); } String sslrootcertfile = PGProperty.SSL_ROOT_CERT.get(info);//获取根证书 if (sslrootcertfile == null) { // Fall back to default sslrootcertfile = defaultdir + "root.crt"; } FileInputStream fis; try { fis = new FileInputStream(sslrootcertfile); // 获取根证书ca的文件流 } catch (FileNotFoundException ex) { throw new PSQLException( GT.tr("Could not open SSL root certificate file {0}.", sslrootcertfile), PSQLState.CONNECTION_FAILURE, ex); } try { CertificateFactory cf = CertificateFactory.getInstance("X.509");// // 获取X.509工厂实例 // Certificate[] certs = cf.generateCertificates(fis).toArray(new Certificate[]{}); //Does // not work in java 1.4 Object[] certs = cf.generateCertificates(fis).toArray(new Certificate[]{});//生成ca证书的数组视图 ks.load(null, null); for (int i = 0; i < certs.length; i++) { ks.setCertificateEntry("cert" + i, (Certificate) certs[i]);//设置证书条目 将给定的可信证书分配给给定的别名。 } tmf.init(ks); } catch (IOException ioex) { throw new PSQLException( GT.tr("Could not read SSL root certificate file {0}.", sslrootcertfile), PSQLState.CONNECTION_FAILURE, ioex); } catch (GeneralSecurityException gsex) { throw new PSQLException( GT.tr("Loading the SSL root certificate {0} into a TrustManager failed.", sslrootcertfile), PSQLState.CONNECTION_FAILURE, gsex); } finally { try { fis.close(); } catch (IOException e) { /* ignore */ } } tm = tmf.getTrustManagers(); } // finally we can initialize the context 最后,我们可以初始化上下文 try { ctx.init(new KeyManager[]{km}, tm, null); } catch (KeyManagementException ex) { throw new PSQLException(GT.tr("Could not initialize SSL context."), PSQLState.CONNECTION_FAILURE, ex); } factory = ctx.getSocketFactory(); } catch (NoSuchAlgorithmException ex) { throw new PSQLException(GT.tr("Could not find a java cryptographic algorithm: {0}.", ex.getMessage()), PSQLState.CONNECTION_FAILURE, ex); } } ```
怎么能观察出JVM的Old区中存储的都是那些对象
操作系统:Solaris10 JDK:SUN JDK1.5.0_17 [b]问题补充:[/b] jmap这个命令我用了,但我发现只是显示出了实例的数量。看不出来哪些对象是在Old区的。你说用Heap工具分析,是什么Heap工具呢?我用了Optimizeit,也是只能看出实例的数量和引用关系,看不出哪些对象是在Old区的。 [b]问题补充:[/b] 我现在的GC策略是这样的,堆最大,最小都是1024m,young区是512m,对象在from和to之间拷贝5次然后扔到old区。回收算法用的是cms。我们的应用对吞吐量的要求比较高,绝大多数都是短生命周期的对象。我在windows下用optimizeit检查了,不存在内存泄漏,但发现在并发量比较大的时候,有几个对象的实例数量是一直在增长的。但当客户端的程序停止的时候,这些对象又是可以被回收的。我们的程序是运行在solaris上的,由于我没下载到optimizeit的solaris安装文件,或者是类似工具的solaris安装文件,因此不确定,olc区中的那些对象是否就是那几个不断增长的对象。我用jvmstat看了,old区涨的很快。而且程序运行大概20分钟左右就core dump了。有的时候会直接把服务器整死。因此我想看看有没有什么手段来看看old区的对象存储的都是什么来帮我肯定一下,就是那几个对象再搞鬼。 [b]问题补充:[/b] 其实这个问题,在昨天临下班之前的10几分钟突然有了进展。终于排查出,我们的程序是没有内存泄漏的。而是由于传输层的拥挤造成的。设置了socket的readReceiveBuffer和sendBuffer之后这个问题得到了缓解。但是为什么会因为传输层的拥挤导致我们old区的对象很多,这点需要再好好研究一下mina框架。 [b]问题补充:[/b] [quote]根据你的说法, 我觉得你的,配置有问题的, 为什么设计-Xmn512m, 这个是很关键的, 如果你要求很低的world stop. 那么把-Xmn设置到128 或者256m, core dump 的原因可能是因为你CMS机制不起作用, 导致并行收集过多产生的。 另外,也跟你的JAVA的版本有关系。 CMS最好使用JAVA6的版本, 在JAVA5上, 这个技术并不是非常成熟。如果是JAVA5, CMS的启动策略是有BUG的, 这个你可以参考我的BLOG : http://sdh5724.iteye.com/admin/blogs/283977 [/quote] young区默认的大小是堆的1/4,但是对于吞吐量优先的程序,可以设置为堆的1/2。因为对象的生命周期短,应该尽可能的让对象在young区就被回收掉,免得被拷贝到old区,再进行回收时,暂停时间会相对较长。网上有些资料显示了,对于吞吐量优先的程序,应该设置一个较大的young区的说法,Sun的网站上也有,将堆设置为3G,young区设置为2G的例子。你说的CMS最好在JAVA6下用,这个我真的不知道。听说JAVA6的GC机制要比JAVA5好。这个我回去试试。 [quote]readReceiveBuffer和sendBuffer 是操作系统参数, 如果你的OS内存很紧张, 也可能导致系统资源不够。 这个参数应该调整成你业务需要的发送接收的大小, 不可以盲目扩大, 每个TCP连接都会占用这个BUFF的大小。 我建议你一般设置成8K。[/quote] 你说的这个我很关系,对这两个参数我也不太了解,但的确是缓解了问题,而且很明显。目前我们只使用了一个TCP连接。对于你说的“这个参数应该调整成你业务需要的发送接收的大小”,我不太明白是什么意思。主要是我不清楚我们需要的大小是多少啊,呵呵。你说的8K,这个是默认配置。但我们使用这个配置时,程序最多只能跑20分钟,程序就死掉了。这涉及到tcp的传输,因为跟我们对接的另一端,他们是C语言写的,目前他们没有设置缓冲区大小,应该用的也是默认的,但C程序我不太了解,不知道是多少。我把这个缓冲区设置为Integer的最大值了,好像是2G(我也觉得有点儿夸张),程序大概跑了四十分钟,服务器宕机了。 [quote]我觉得, 你是不是因为TCP的连接断开后, 没有释放TCP连接? socket.close(). 会导致大量的time_wait的连接, 你要仔细看下。 OS会在比较长的时间回收[/quote] 我们现在就一个TCP链接,出现问题时,链接没断过。我们应该是没有内存泄漏的,我用Optimizeit检查了好多次了。 很高兴与你讨论这个问题,我感觉现在问题出现在TCP的缓冲区上,应该让C那边也设置一个较大的缓冲区,然后再看看问题能不能得到解决。 [b]问题补充:[/b] 经过几天的测试,总结如下: 1.机器宕机居然是机器的问题,那个机器,不管上面运行的是我们的应用程序还是模拟器,都会宕机。换了其他的几台服务器,都没出现宕机的问题。 2.buffer的设置:我们一个消息的长度是20个字节。每秒钟2000条消息,就是40000个字节,因次buffer设置为40000。但最后还是没有设置这个值采用默认的。因为问题可能不在这里。 3.目前的问题,使用mina的client接收消息时,每秒钟2000条,大概运行一段时间之后,就会mina就会接收到一个很大的包(100K以上)。这导致我们应用层解析这个消息的时候调用层次过多,抛出stackOverFlow的异常,并且主动把连接关闭了。其实,我们可以修改一下我们的代码,避免抛出这个异常。但这不是问题的根源,因为mina传了一个这么大的数据包给应用层就是不正常的。于是我看了一下mina的代码,在read的时候,会根据接收到的消息的长度,来调整allocate的长度。这个上限是receiveByteBuffer的2倍。我尝试修改了mina的代码,让他每次固定allocate 1024个字节。但是问题依然存在,目前没找到解决方法。为了规避这个问题,只是让服务端不给我们发送这个应答,这在业务上是允许的。但没找到问题的根源总是感觉心里堵的荒,打算试试grizzly。
c#异步通信代码错误问题
public void ConnectCallback(IAsyncResult ar) { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); bool connect_flag = false; connect_flag = true; ManualResetEvent connectDone = new ManualResetEvent(false); //连接的信号 connectDone.Set(); } //vs的这段代码中 ,bool connect_flag的connect_flag报了一个警告错误,变量connect_flag已赋值,但是其值从未使用过。如何修改? public static MODEL.DataSourceVersionQuery BrowseDataSource_QueryVersionData() { MODEL.DataSourceVersionQuery result = new MODEL.DataSourceVersionQuery(); //获取数据包 string strPacket = BrowseDataSource_PrepareVersionPacket(); //向服务端提交查询版本信息 string str = DAL.socket.GetSocketData(strPacket); //DAL.socket.GetSocketData(strPacket) vs报了一个错误,非静态字段、方法或属性DAL.socket.GetSocketData(string)“要求对象引用。如何修改? 还有这个错误![图片说明](https://img-ask.csdn.net/upload/201509/16/1442412249_893824.png) 另外我想把DAL中的socket.cs的 public byte[] bytesReceived { get; set; }这段移动到Model中而不报错要如何修改? DAL中socket完整代码如下: using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Data; using System.Windows.Forms; using System.Threading; namespace DAL { /// <summary> /// Socket接口 /// </summary> class socket { //Socket public Socket clientSocket; /// <summary> /// socket连接 /// </summary> /// <returns> /// true 成功 /// false 失败 /// </returns> public bool SocketConnect() { byte[] bytesReceived = new byte[256]; ManualResetEvent connectDone = new ManualResetEvent(false); //连接的信号 ManualResetEvent sendDone = new ManualResetEvent(false); //发送结束 //从配置文件获取IP string SocketIP = DAL.Common.ReadConfigString("Recover", "IP"); //从配置文件获取端口 int SocketPort = Convert.ToInt32(DAL.Common.ReadConfigString("Recover", "Port")); //创建IP地址 IPAddress IP = IPAddress.Parse(SocketIP); try { //创建socket实例 clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建网络端点 IPEndPoint ipEnd = new IPEndPoint(IP, SocketPort); //与目标终端连接 clientSocket.BeginConnect(ipEnd, new AsyncCallback(ConnectCallback), clientSocket);//调用回调函数 connectDone.WaitOne(); if (clientSocket.Connected) { return true; } else { return false; } } catch (Exception e) { string strError = ""; strError += "\r\n SocketIP = " + SocketIP.ToString(); strError += "\r\n SocketPort = " + SocketPort.ToString(); DAL.Common.WriteErrorLog(e, strError); return false; } } /// <summary> /// 异步连接的回调函数 /// </summary> /// <param name="ar"></param> public void ConnectCallback(IAsyncResult ar) { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); bool connect_flag = false; connect_flag = true; ManualResetEvent connectDone = new ManualResetEvent(false); //连接的信号 connectDone.Set(); } /// <summary> /// Socket发送数据 /// </summary> /// <param name="strSend"> /// 数据的内容 /// </param> public void SocketSend(string strSend) { Socket clientSocket; //发送创建套接字 int length = strSend.Length; Byte[] bytesSent = new byte[length]; clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { bytesSent = System.Text.Encoding.Default.GetBytes(strSend); //将字符串指定到指定Byte数组 clientSocket.BeginSend(bytesSent, 0, bytesSent.Length, 0, new AsyncCallback(SendCallback), clientSocket); //异步发送数据 ManualResetEvent sendDone = new ManualResetEvent(false);//发送结束 sendDone.WaitOne(); } catch (Exception e) { string strError = ""; DAL.Common.WriteErrorLog(e, strError); } } public void SendCallback(IAsyncResult ar) //发送的回调函数 { ManualResetEvent sendDone = new ManualResetEvent(false); //发送结束 Socket client = (Socket)ar.AsyncState; int bytesSend = client.EndSend(ar); //完成发送 sendDone.Set(); } /// <summary> /// Socket接收数据 /// </summary> /// <returns> /// 收到的数据 /// </returns> public string SocketReceive() { string result = ""; try { MemoryStream stream = new MemoryStream(); Byte[] bytesReceived = new Byte[256]; clientSocket.BeginReceive(bytesReceived, 0, bytesReceived.Length, 0, new AsyncCallback(ReceiveCallback), clientSocket); ManualResetEvent sendDone = new ManualResetEvent(false); //发送结束 sendDone.WaitOne(); } catch (Exception e) { string strError = ""; DAL.Common.WriteErrorLog(e, strError); } return result; } public void ReceiveCallback(IAsyncResult ar) { Socket client = (Socket)ar.AsyncState; //获取句柄 int bytesread = client.EndReceive(ar); if (bytesread > 0) { clientSocket.BeginReceive(bytesReceived, 0, bytesReceived.Length, 0, new AsyncCallback(ReceiveCallback), client); string content = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length); } else { ManualResetEvent readDone = new ManualResetEvent(false); //读信号 readDone.Set(); } } /// <summary> /// Socket通信 /// </summary> /// <param name="strSend"> /// 发送的信息 /// </param> /// <returns> /// 包体的内容 /// </returns> public string GetSocketData(string strSend) { string strDatas = ""; string strResult = ""; string strExtLength = ""; try { //Socket连接 SocketConnect(); //发送信息 SocketSend(strSend); //接收服务器的信息 strResult = SocketReceive(); //获取扩展信息的长度 strExtLength = strResult.Substring(16, 12); int ExtLength = Convert.ToInt32(strExtLength); //扩展信息,暂不使用 //string strExtInfo = strResult.Substring(32, ExtLength); //获取包体的内容 strDatas = strResult.Substring(ExtLength + 32); //strDatas = decodedString; } catch (Exception e) { string strError = ""; strError += "\r\n strResult = " + strResult; strError += "\r\n strExtLength = " + strExtLength; DAL.Common.WriteErrorLog(e, strError); strDatas = ""; } return strDatas; } public string SocketReceiveFile(string FileName) { string result = ""; try { MemoryStream streamPacketLength = new MemoryStream(); Byte[] bytesPacketLength = new Byte[16]; clientSocket.Receive(bytesPacketLength, bytesPacketLength.Length, 0); streamPacketLength.Write(bytesPacketLength, 0, bytesPacketLength.Length); result = System.Text.Encoding.Default.GetString(streamPacketLength.ToArray()); int PacketLength = Convert.ToInt32(result); streamPacketLength.Close(); MemoryStream streamExtLength = new MemoryStream(); Byte[] bytesExtLength = new Byte[12]; clientSocket.Receive(bytesExtLength, bytesExtLength.Length, 0); streamExtLength.Write(bytesExtLength, 0, bytesExtLength.Length); result = System.Text.Encoding.Default.GetString(streamExtLength.ToArray()); int ExtLength = Convert.ToInt32(result); streamExtLength.Close(); MemoryStream streamProtocol = new MemoryStream(); Byte[] bytesProtocol = new Byte[4]; clientSocket.Receive(bytesProtocol, bytesProtocol.Length, 0); streamProtocol.Write(bytesProtocol, 0, bytesProtocol.Length); result = System.Text.Encoding.Default.GetString(streamProtocol.ToArray()); string Protocol = result; streamProtocol.Close(); MemoryStream streamExtInfo = new MemoryStream(); Byte[] bytesExtInfo = new Byte[ExtLength]; clientSocket.Receive(bytesExtInfo, bytesExtInfo.Length, 0); streamExtInfo.Write(bytesExtInfo, 0, bytesExtInfo.Length); result = System.Text.Encoding.Default.GetString(streamExtInfo.ToArray()); byte[] Buffer = Convert.FromBase64String(result); string strExtInfo = UTF8Encoding.UTF8.GetString(Buffer); streamExtInfo.Close(); MODEL.FileTrackQuery ExtInfo = new MODEL.FileTrackQuery(); ExtInfo = JsonConvert.DeserializeObject<MODEL.FileTrackQuery>(strExtInfo); if (ExtInfo.code == "00") { FileInfo fi = new FileInfo(FileName); DirectoryInfo di = fi.Directory; if (!di.Exists) { di.Create(); } FileStream streamPacketInfo = new FileStream(FileName, FileMode.Create); if (PacketLength > 0) { Byte[] bytesPacketInfo = new Byte[PacketLength]; int bytes = 0; do { bytes = clientSocket.Receive(bytesPacketInfo, bytesPacketInfo.Length, 0); streamPacketInfo.Write(bytesPacketInfo, 0, bytes); } while (bytes > 0); } streamPacketInfo.Close(); } clientSocket.Close(); string strLogFile = System.AppDomain.CurrentDomain.BaseDirectory + "debug.txt"; StreamWriter sw = new StreamWriter(strLogFile, true); sw.WriteLine("PacketLength : " + PacketLength.ToString()); sw.WriteLine("ExtLength : " + ExtLength.ToString()); sw.WriteLine("strExtInfo : " + strExtInfo); sw.WriteLine("ExtInfo.code : " + ExtInfo.code); sw.WriteLine("\n------------------------------------------------------------------------\n"); sw.Flush(); sw.Close(); } catch (Exception e) { string strError = ""; DAL.Common.WriteErrorLog(e, strError); } return result; } public string GetSocketFile(string strSend, string FileName) { string strDatas = ""; string strResult = ""; string strExtLength = ""; try { //Socket连接 SocketConnect(); //发送信息 SocketSend(strSend); //接收服务器的信息 strResult = SocketReceiveFile(FileName); //获取扩展信息的长度 //strExtLength = strResult.Substring(16, 12); //int ExtLength = Convert.ToInt32(strExtLength); //扩展信息,暂不使用 //string strExtInfo = strResult.Substring(32, ExtLength); //获取包体的内容 //strDatas = strResult.Substring(ExtLength + 32); } catch (Exception e) { string strError = ""; strError += "\r\n strResult = " + strResult; strError += "\r\n strExtLength = " + strExtLength; DAL.Common.WriteErrorLog(e, strError); strDatas = ""; } return strDatas; } public byte[] bytesReceived { get; set; } } } MODEL完整代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MODEL { public enum ClientEditionEnum { Enterprise,//企业版 Personal,//个人版 Internal,//内部版 None,//error } /// <summary> /// 授权文件内容 /// </summary> public class AuthorizeFileInfo { public string startTime { get; set; } public string expiryTime { get; set; } public string licenseID { get; set; } public string licensePassword { get; set; } public string terminalID { get; set; } public string customName { get; set; } public string customID { get; set; } public AuthorizeFileInfo() { startTime = ""; expiryTime = ""; licenseID = ""; licensePassword = ""; terminalID = ""; customName = ""; customID = ""; } } /// <summary> /// 通用返回值 /// </summary> /// public class CommonResult { public string code { get; set; } public string message { get; set; } public CommonResult() { code = ""; message = ""; } } public class EnterpriseConfirmAuthorizeDatas { public string sessionID { get; set; } public EnterpriseConfirmAuthorizeDatas() { sessionID = ""; } } /// <summary> /// 企业版授权校验接口 /// </summary> public class EnterpriseConfirmAuthorizeResult { public string code { get; set; } public string message { get; set; } public EnterpriseConfirmAuthorizeDatas datas { get; set; } public EnterpriseConfirmAuthorizeResult() { code = ""; message = ""; datas = new EnterpriseConfirmAuthorizeDatas(); } } public class PersonalConfirmAuthorizeDatas { public string sessionID { get; set; } public string licenseInfo { get; set; } public PersonalConfirmAuthorizeDatas() { sessionID = ""; licenseInfo = ""; } } /// <summary> /// 个人版授权校验接口 /// </summary> public class PersonalConfirmAuthorizeResult { public string code { get; set; } public string message { get; set; } public PersonalConfirmAuthorizeDatas datas { get; set; } public PersonalConfirmAuthorizeResult() { code = ""; message = ""; datas = new PersonalConfirmAuthorizeDatas(); } } /// <summary> /// 鉴权信息,每次调用安全接口时使用 /// </summary> public class LicInfo { public string licenseID { get; set; } public string licensePassword { get; set; } public string terminalID { get; set; } public string deviceID { get; set; } public string sessionID { get; set; } public LicInfo() { licenseID = ""; licensePassword = ""; terminalID = ""; deviceID = ""; sessionID = ""; } } /// <summary> /// java引擎的参数 /// </summary> public class JavaEngineArg { public string licenseID { get; set; } public string licensePassword { get; set; } public string terminalID { get; set; } public string customName { get; set; } public string customID { get; set; } public string deviceID { get; set; } public JavaEngineArg() { licenseID = ""; licensePassword = ""; terminalID = ""; customName = ""; customID = ""; deviceID = ""; } } /// <summary> /// 用户登录接口(一),非安全接口 /// </summary> /// public class UserInfoUnSafe { public string userID { get; set; } public string userName { get; set; } public string departmentName { get; set; } public UserInfoUnSafe() { userID = ""; userName = ""; departmentName = ""; } } public class UserLoginUnSafe { public string code { get; set; } public string message { get; set; } public UserInfoUnSafe datas { get; set; } public UserLoginUnSafe() { code = ""; message = ""; datas = new UserInfoUnSafe(); } } /// <summary> /// 个人版用户登录接口,非安全接口 /// </summary> /// public class UserInfoForPersonal { public string userID { get; set; } public string userName { get; set; } public string departmentName { get; set; } public string licenseInfo { get; set; } public UserInfoForPersonal() { userID = ""; userName = ""; departmentName = ""; licenseInfo = ""; } } public class UserLoginForPersonal { public string code { get; set; } public string message { get; set; } public UserInfoForPersonal datas { get; set; } public UserLoginForPersonal() { code = ""; message = ""; datas = new UserInfoForPersonal(); } } /// <summary> /// 用户登录接口(二),安全接口 /// </summary> /// public class UserInfoSafe { public string userSessionID { get; set; } public string userID { get; set; } public string userName { get; set; } public string departmentName { get; set; } public string activeTime { get; set; } public UserInfoSafe() { userSessionID = ""; userID = ""; userName = ""; departmentName = ""; activeTime = ""; } } public class UserLoginSafe { public string code { get; set; } public string message { get; set; } public UserInfoSafe datas { get; set; } public UserLoginSafe() { code = ""; message = ""; datas = new UserInfoSafe(); } } /// <summary> /// 更新检查接口 /// </summary> /// public class SingleVersion { public string softID { get; set; } public int version { get; set; } public SingleVersion() { softID = ""; version = new int(); } } public class Versions { public List<SingleVersion> versions { get; set; } public Versions() { versions = new List<SingleVersion>(); } } public class VersionUpdate { public string softID { get; set; } public int version { get; set; } public string url { get; set; } public VersionUpdate() { softID = ""; version = new int(); url = ""; } } public class VersionCheck { public string code { get; set; } public string message { get; set; } public List<VersionUpdate> datas { get; set; } public VersionCheck() { code = ""; message = ""; datas = new List<VersionUpdate>(); } } /// <summary> /// 数据源信息查询接口 /// </summary> /// public class OptInfoQuery { public string createUserID { get; set; } public string createUserName { get; set; } public string createUserTime { get; set; } public OptInfoQuery() { createUserID = ""; createUserName = ""; createUserTime = ""; } } public class Period { public int cycle { get; set; } public int cycleUnit { get; set; } public string timer { get; set; } public Period() { cycle = 1; cycleUnit = 1; timer = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); } } public class StrategyConfig { public int backType { get; set; } public int taskType { get; set; } public Period config { get; set; } public StrategyConfig() { backType = 0; taskType = 1; config = new Period(); } } public class FilterFileSuffix { public string suffix { get; set; } public FilterFileSuffix() { suffix = ""; } } public class Scan { public int scanType { get; set; } public string root { get; set; } public bool scanHideFile { get; set; } public string verifyCompleteName { get; set; } public int verifyCompleteMaxCount { get; set; } public int verifyCompleteTimer { get; set; } public string fileAttrGainer { get; set; } public bool recordCanNotReadFileInfo { get; set; } public bool recordEmptyDirectory { get; set; } public bool recordEmptyFile { get; set; } public List<FilterFileSuffix> filterFileSuffix { get; set; } public Scan() { scanType = 2; root = ""; scanHideFile = false; verifyCompleteName = ""; verifyCompleteMaxCount = 5; verifyCompleteTimer = 10000; fileAttrGainer = "null"; recordCanNotReadFileInfo = false; recordEmptyDirectory = false; recordEmptyFile = false; filterFileSuffix = new List<FilterFileSuffix>(); } } public class DataSourceConfigQuery { public int status { get; set; } public int dataSourceType { get; set; } public string dataSourceID { get; set; } public string dataSourceName { get; set; } public string dataSourceDescription { get; set; } public Scan config { get; set; } public DataSourceConfigQuery() { status = 0; dataSourceType = 0; dataSourceID = ""; dataSourceName = ""; dataSourceDescription = ""; config = new Scan(); } } public class DatasQuery { public OptInfoQuery optInfo { get; set; } public StrategyConfig strategyConfig { get; set; } public DataSourceConfigQuery dataSourceConfig { get; set; } public DatasQuery() { optInfo = new OptInfoQuery(); strategyConfig = new StrategyConfig(); dataSourceConfig = new DataSourceConfigQuery(); } } public class DataSourceInfoQuery { public string code { get; set; } public string message { get; set; } public List<DatasQuery> datas { get; set; } public DataSourceInfoQuery() { code = ""; message = ""; datas = new List<DatasQuery>(); } } public class WebSite { public string ExpirationTime { get; set; } public string WebSiteSpace { get; set; } public bool DataBaseEnable { get; set; } public string DataBaseUserName { get; set; } public string DataBasePassword { get; set; } public string DataBaseMark { get; set; } public string WebSiteAdmin { get; set; } public string WebSitePassword { get; set; } public WebSite() { ExpirationTime = ""; WebSiteSpace = ""; DataBaseEnable = false; DataBaseUserName = ""; DataBasePassword = ""; DataBaseMark = ""; WebSiteAdmin = ""; WebSitePassword = ""; } } public class WebSiteDatasQuery { public OptInfoQuery optInfo { get; set; } public StrategyConfig strategyConfig { get; set; } public DataSourceConfigQuery dataSourceConfig { get; set; } public WebSite webSiteConfig { get; set; } public WebSiteDatasQuery() { optInfo = new OptInfoQuery(); strategyConfig = new StrategyConfig(); dataSourceConfig = new DataSourceConfigQuery(); webSiteConfig = new WebSite(); } } public class WebSiteDataSourceInfoQuery { public string code { get; set; } public string message { get; set; } public List<WebSiteDatasQuery> datas { get; set; } public WebSiteDataSourceInfoQuery() { code = ""; message = ""; datas = new List<WebSiteDatasQuery>(); } } /// <summary> /// 新增数据源接口 /// </summary> /// public class OptInfoNew { public bool forceFlag { get; set; } public OptInfoNew() { forceFlag = true; } } public class DataSourceConfigNew { public int dataSourceType { get; set; } public string dataSourceName { get; set; } public string dataSourceDescription { get; set; } public Scan config { get; set; } public DataSourceConfigNew() { dataSourceType = 0; dataSourceName = ""; dataSourceDescription = ""; config = new Scan(); } } public class DataSourceNew { public OptInfoNew optInfo { get; set; } public StrategyConfig strategyConfig { get; set; } public DataSourceConfigNew dataSourceConfig { get; set; } public DataSourceNew() { optInfo = new OptInfoNew(); strategyConfig = new StrategyConfig(); dataSourceConfig = new DataSourceConfigNew(); } } /// <summary> /// 修改数据源接口 /// </summary> /// public class DataSourceModify { public StrategyConfig strategyConfig { get; set; } public DataSourceConfigQuery dataSourceConfig { get; set; } public DataSourceModify() { strategyConfig = new StrategyConfig(); dataSourceConfig = new DataSourceConfigQuery(); } } /// <summary> /// 停用/启用数据源接口 /// </summary> /// public class DataSourceStatus { public string dataSourceID { get; set; } public int optType { get; set; } public DataSourceStatus() { dataSourceID = ""; optType = new int(); } } /// <summary> /// 数据源数据,仅用于存放数据 /// </summary> /// public class DataSourceData { public List<DatasQuery> datas { get; set; } public DataSourceData() { datas = new List<DatasQuery>(); } } /// <summary> /// WebSite数据源数据,仅用于存放数据 /// </summary> /// public class WebSiteDataSourceData { public List<WebSiteDatasQuery> datas { get; set; } public WebSiteDataSourceData() { datas = new List<WebSiteDatasQuery>(); } } /// <summary> /// 文件恢复,版本查询 /// </summary> /// public class DataSourceVersionArg { // 通讯令牌 public string secretKey { get; set; }//由token进过MD5->BASE64->MD5获得 // 任务令牌 public string token { get; set; }//客户端生成一个UUID // 前置机编号 public string terminalId { get; set; } // 操作用户编号 public string optUserID { get; set; } public DataSourceVersionArg() { secretKey = ""; token = ""; terminalId = ""; optUserID = ""; } } public class FileVersions { public int file_count { get; set; } public long space_size { get; set; } public string task_id { get; set; } public string task_time { get; set; } public int total_count { get; set; } public string version { get; set; } public FileVersions() { file_count = new int(); space_size = new long(); task_id = ""; task_time = ""; total_count = new int(); version = ""; } } public class DataSourceVersion { public Scan datasourceConfig { get; set; } public string datasourceId { get; set; } public string datasourceName { get; set; } public int datasourceStatus { get; set; } public int datasourceType { get; set; } public List<FileVersions> versions { get; set; } public DataSourceVersion() { datasourceConfig = new Scan(); datasourceId = ""; datasourceName = ""; datasourceStatus = new int(); datasourceType = new int(); versions = new List<FileVersions>(); } } /// <summary> /// 查询数据源接口 /// </summary> public class DataSourceVersionQuery { public string code { get; set; } public string message { get; set; } public List<DataSourceVersion> datas { get; set; } public DataSourceVersionQuery() { code = ""; message = ""; datas = new List<DataSourceVersion>(); } } /// <summary> /// 数据源版本信息 /// </summary> public class DataSourceVersionDatas { public List<DataSourceVersion> datas { get; set; } public DataSourceVersionDatas() { datas = new List<DataSourceVersion>(); } } /// <summary> /// 文件恢复,文件信息查询 /// </summary> /// public class QueryFileInfoArg { // 通讯令牌 public string secretKey { get; set; }//由token进过MD5->BASE64->MD5获得 // 任务令牌 public string token { get; set; }//客户端生成一个UUID // 数据源编号 public string datasourceId { get; set; } // 操作用户编号 public string optUserID { get; set; } // 目录文件编号--如果为根目录使用 DS_ROOT public string fileID { get; set; } // 查询的版本编号 如果是综合分析 这个字段设置为 ALL public string taskID { get; set; } public QueryFileInfoArg() { secretKey = ""; token = ""; datasourceId = ""; optUserID = ""; fileID = ""; taskID = ""; } } public class FileInfoCondition { public string datasourceId { get; set; } public string parentId { get; set; } public string taskID { get; set; } public FileInfoCondition() { datasourceId = ""; parentId = ""; taskID = ""; } } public class FileInfo { // 文件唯一编号 public string file_id { get; set; } // 源相对目录 public string file_src_path { get; set; } // 文件名 public string file_name { get; set; } // 文件后缀 public string file_suffix { get; set; } // 是否为文件 public bool is_file { get; set; } // 上级文件编号 public string parent_id { get; set; } // 是否删除 public bool is_del { get; set; } // 是否隐藏 public bool is_hide { get; set; } // 文件大小 public int size { get; set; } // 文件创建时间 public string create_time { get; set; } // 文件创建人 public string create_user { get; set; } // 文件最后修改时间 public string lm_time { get; set; } // 文件最后修改人 public string lm_user { get; set; } // 是否可读 public bool can_read { get; set; } public FileInfo() { file_id = ""; file_src_path = ""; file_name = ""; file_suffix = ""; is_file = new bool(); parent_id = ""; is_del = new bool(); is_hide = new bool(); size = new int(); create_time = ""; create_user = ""; lm_time = ""; lm_user = ""; can_read = new bool(); } } public class FileInfoAndCondition { public FileInfoCondition condition { get; set; } public List<FileInfo> fileInfos { get; set; } public FileInfoAndCondition() { condition = new FileInfoCondition(); fileInfos = new List<FileInfo>(); } } /// <summary> /// 查询文件信息接口 /// </summary> public class FileInfoQuery { public string code { get; set; } public string message { get; set; } public FileInfoAndCondition datas { get; set; } public FileInfoQuery() { code = ""; message = ""; datas = new FileInfoAndCondition(); } } /// <summary> /// 文件信息 /// </summary> public class FileInfoData { public List<FileInfo> datas { get; set; } public FileInfoData() { datas = new List<FileInfo>(); } } public class QueryFileTrackArg { // 通讯令牌 public string secretKey { get; set; }//由token进过MD5->BASE64->MD5获得 // 任务令牌 public string token { get; set; }//客户端生成一个UUID // 文件编号 public string fileID { get; set; } // 操作用户编号 public string optUserID { get; set; } // 查询的版本编号 public string taskID { get; set; } public QueryFileTrackArg() { secretKey = ""; token = ""; fileID = ""; optUserID = ""; taskID = ""; } } public class FileTrack { // 文件操作 public string act_cmd { get; set; } // 是否可读 public bool can_read { get; set; } // 文件创建时间 public string create_time { get; set; } // 文件创建人 public string create_user { get; set; } // 是否删除 public bool is_del { get; set; } // 是否隐藏 public bool is_hide { get; set; } // 文件最后修改时间 public string lm_time { get; set; } // 文件最后修改人 public string lm_user { get; set; } // 文件大小 public int size { get; set; } public string taskID { get; set; } public FileTrack() { act_cmd = ""; can_read = new bool(); create_time = ""; create_user = ""; is_del = new bool(); is_hide = new bool(); lm_time = ""; lm_user = ""; size = new int(); taskID = ""; } } public class FileTrackCondition { public string fileID { get; set; } public string taskID { get; set; } public FileTrackCondition() { fileID = ""; taskID = ""; } } /// <summary> /// 查询文件轨迹接口 /// </summary> public class FileTrackQuery { public string code { get; set; } public string message { get; set; } public FileTrackCondition condition { get; set; } public List<FileTrack> datas { get; set; } public FileTrackQuery() { code = ""; message = ""; condition = new FileTrackCondition(); datas = new List<FileTrack>(); } } /// <summary> /// 文件轨迹 /// </summary> public class FileTrackData { public List<FileTrack> datas { get; set; } public FileTrackData() { datas = new List<FileTrack>(); } } /// <summary> /// 字典item /// </summary> public class DictionaryData { public string version { get; set; } public string task_time { get; set; } public DictionaryData() { version = ""; task_time = ""; } } public class FileRecoverArg { // 通讯令牌 public string secretKey { get; set; }//由token进过MD5->BASE64->MD5获得 // 任务令牌 public string token { get; set; }//客户端生成一个UUID // 操作用户编号 public string optUserID { get; set; } public string fileID { get; set; } public string taskID { get; set; } public string password { get; set; } public FileRecoverArg() { secretKey = ""; token = ""; optUserID = ""; fileID = ""; taskID = ""; password = ""; } } }
jwchat JabberHTTPBind中 socket 输入流截断问题2
1.在网上下了一个JWCHAT1.0 版本的后台用JabberHTTPBind 和openfire绑定,登录后从openfire服务中取得rouster流的XML 的时候由于字符串很长。JabberHTTPBind 的readFromSocket 方法取得OPNFFIRE XML字符会截断,造成客户端JWCHAT 登录不上。 [code="java"]private String readFromSocket(long rid) throws IOException { String retval = ""; char buf[] = new char[16]; int c = 0; Response r = this.getResponse(rid); while (!this.sock.isClosed() && !this.isStatus(SESS_TERM)) { this.setLastActive(); try { if (this.br.ready()) { while (this.br.ready() && (c = this.br.read(buf, 0, buf.length)) >= 0) retval += new String(buf, 0, c); break; // got sth. to send } else { if ((this.hold == 0 && r != null && System .currentTimeMillis() - r.getCDate() > 200) || /* * makes polling clients feel a little bit more * responsive */ (this.hold > 0 && ((r != null && System .currentTimeMillis() - r.getCDate() >= this.getWait() * 1000) || this.numPendingRequests() > this .getHold() || !retval.equals(""))) || r.isAborted()) { log.info("readFromSocket done for " + rid); break; // time exeeded } try { Thread.sleep(READ_TIMEOUT); // wait for incoming // packets } catch (InterruptedException ie) { log.error(ie.toString()); } } } catch (IOException e) { log.error("Can't read from socket"); this.terminate(); } } if (this.sock.isClosed()) { throw new IOException(); } return retval; }[/code] 这段从sockt 输入流 sockt.getInputStream() 取得数据流打印出来数据截断了不符合JABBER XML 数据 出错了 日志中: [color=red]第一段字符[/color] inQueue: <iq type="result" id="roster_1" to="zhouhui.0001@bbc.com.cn/jwchat"><query xmlns="jabber:iq:roster"><item jid="yuning.0001@bbc.com.cn" name="于宁" subscription="both" priority="8" belong="componly"><company></company><department priority="15">增值应用业务部</department></item><item jid="libaoguo.0001@bbc.com.cn" name="李保国" subscription="both" priority="8" belong="componly"><company>bb公司</company><department priority="12">集成业务部</department></item><item jid="liuchang.0001@bbc.com.cn" name="刘畅" subscription="both" priority="8" belong="componly"><company>bb公司</company><department priority="18">xx业务部</department></item><item jid="shihui_lxgs.0001@bbc.com.cn" name="石慧" subscription="both" priority="8" belong="componly"><company>bb公司</company><department priority="12">集成业务部</department></item><item jid="zhangwenping.0001@bbc.com.cn" name="张文平" subscription="both" priority="8" belong="componly"><company>bb公司</company><department priority="8">商务管理采购部</department></item><item jid="yangshengjun.0001@bbc.com.cn" name="杨胜军" subscription="both" priority="8" belong="componly"><company>bb公司</company><department [color=red]第二段字符[/color] inQueue: priority="14">xx支撑软件部</department></item>。。。。。。。 整个XML 给截断了 不知道什么原因。 后来自己机器上架设OPENFIRE 做服务器,rouser数据较多 inQueue: <iq type="result" id="roster_1" to="user1@test7/jwchat"><query xmlns="jabber:iq:roster"><item jid="user406@test7" name="person406" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user284@test7" name="person284" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user212@test7" name="person212" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user140@test7" name="person140" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user23@test7" name="person23" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user0@test7" name="person0" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user191@test7" name="person191" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user444@test7" name="person444" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user28@test7" name="person28" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user489@test7" name="person489" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user493@test7" name="person493" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user359@test7" name="person359" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user475@test7" name="person475" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user490@test7" name="person490" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user462@test7" name="person462" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user187@test7" name="person187" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user446@test7" name="person446" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user118@test7" name="person118" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="test1@test7" nickname="person1" subscription="both"><company>product0</company><group>其他联系人</group></item><item jid="user426@test7" name="person426" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user5@test7" name="person5" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user310@test7" name="person310" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user60@test7" name="person60" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user146@test7" name="person146" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user478@test7" name="person478" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user50@test7" name="person50" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user312@test7" name="person312" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user454@test7" name="person454" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user341@test7" name="person341" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user492@test7" name="person492" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user415@test7" name="person415" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user437@test7" name="person437" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user159@test7" name="person159" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user248@test7" name="person248" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user151@test7" name="person151" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user63@test7" name="person63" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user344@test7" name="person344" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user31@test7" name="person31" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user226@test7" name="person226" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user221@test7" name="person221" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user204@test7" name="person204" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user9@test7" name="person9" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user438@test7" name="person438" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user65@test7" name="person65" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user133@test7" name="person133" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user282@test7" name="person282" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user395@test7" name="person395" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user260@test7" name="person260" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user467@test7" name="person467" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user285@test7" name="person285" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user345@test7" name="person345" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user67@test7" name="person67" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user218@test7" name="person218" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user48@test7" name="person48" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user348@test7" name="person348" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user297@test7" name="person297" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user473@test7" name="person473" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user104@test7" name="person104" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user354@test7" name="person354" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user176@test7" name="person176" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user136@test7" name="person136" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user434@test7" name="person434" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user179@test7" name="person179" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user117@test7" name="person117" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user166@test7" name="person166" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user484@test7" name="person484" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user488@test7" name="person488" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user164@test7" name="person164" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user399@test7" name="person399" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user474@test7" name="person474" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user82@test7" name="person82" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user134@test7" name="person134" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user376@test7" name="person376" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user403@test7" name="person403" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user167@test7" name="person167" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user326@test7" name="person326" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user246@test7" name="person246" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user320@test7" name="person320" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user471@test7" name="person471" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user106@test7" name="person106" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user306@test7" name="person306" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user102@test7" name="person102" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user62@test7" name="person62" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user367@test7" name="person367" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user394@test7" name="person394" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user386@test7" name="person386" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user79@test7" name="person79" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item><item jid="user452@test7" name="person452" subscription="both" priority="-1" belong="sameCompany"><company>producttest0</company><department priority="-1">grouptest0</department></item> </query></iq> 这段XML 完整打印出来没有截断,感觉应该和长度限制什么没有关系,怀疑和服务端响应时间什么的有关系 [b]问题补充:[/b] 我后来又试验了,用我机器做服务器,同事的机器启动JWCHAT 访问我的服务端OPEFIRE。还是没有截断。应该和你说的这个不一样的,这里的包应该也是分多个包发的吧。 注:我和我同事机器是同一个网段。被截断的服务器网段和我们不是一个网段。
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
剑指Offer对答如流系列 - 重建二叉树
面试题6:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点。二叉树结点的定义如下: class TreeNode{ int val; TreeNode l...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
非典逼出了淘宝和京东,新冠病毒能够逼出什么?
loonggg读完需要5分钟速读仅需 2 分钟大家好,我是你们的校长。我知道大家在家里都憋坏了,大家可能相对于封闭在家里“坐月子”,更希望能够早日上班。今天我带着大家换个思路来聊一个问题...
用前端5分钟写一个在线m3u8在线播放器
&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;meta http-equiv="X...
立即提问