关于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 的说法很正确啊 一直都只盯着流 却忽略了这里 多谢各位了

6个回答

原来以为你是传的字符……

如果二进制字串,不要用 reader,reader是面向char
会按char编码.
两个字节的 0 0 会被合并成一个0 .......

直接用InputStream读byte数组

socket获得的是什么码?如果是hex码很多是不可见字符!

你可以用这样的方式获得相关报文:
[code="java"]DataInputStream serverIn;//输入报文
serverIn = new DataInputStream (
new BufferedInputStream (socket.getInputStream ())
);
byte[] b=new byte[1024];
serverIn.read (b)[/code]

用stream处理网络数据经常注意,有时候,数据是分多次传来的。(刚好分多个数据包了)

如果不知道完整的长度的话,
等待一段时间,直到超时比较好。

你的解析与正确的结果的差异在于0的个数不对,其余不是0的字符都能对上。顺便问下,你的解析结果中的小写字母应该是大写的吧。
ASCii码中十进制的值为0的字符是null,也就是空。但是后面的解释说是“控制字符”,我认为是输入流中的一些控制字符你没有读进来,导致你转换后0的个数减少。因为你做了str=in.readLine())!=null的判断。也不知道到发送端是怎样将原始数据转换为字符串的,所以不能确定。希望对你有所帮助。

首先 不同操作系统 不同服务器 对高低位的设置是不一样的 比如你向AIX下 发生字节 就会出错 所以我个人建议你用字符,,,,,,

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
socket通信为什么获取不到流里面的数据
就是我在用while循环读取数据的时候读不出来?但是我打印new String(buf).trim()就有数据? 我们后台是.net写的。请问这是个什么问题 package com.jm.jmsdk_tools_jar; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketTimeoutException; public class Socketest { public synchronized static String sendMsg(String host, int port, String msg) { // 写 String result = null; InputStream is = null; OutputStreamWriter osw = null; BufferedReader reader = null; Socket socket = new Socket(); try { if (port < 0) { return ""; } InetSocketAddress isa = new InetSocketAddress(host, port); socket.connect(isa, 10000); osw = new OutputStreamWriter(socket.getOutputStream()); BufferedWriter writer = new BufferedWriter(osw); writer.write(msg); writer.flush(); StringBuffer sb = new StringBuffer(); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("reader:"+reader); int len = 0; char[] buf = new char[1024]; while ((len = reader.read(buf)) != -1) { sb.append(buf, 0, len); System.out.println(new String(buf).trim()); } result = sb.toString(); System.out.println("result:" + result); } catch (SocketTimeoutException e) { e.printStackTrace(); return null; } catch (ConnectException e) { return null; } catch (Exception e) { e.printStackTrace(); return null; } finally { try { if (reader != null) try { reader.close(); } catch (Exception e) { } closeOutputStreamWriter(osw); closeInputStream(is); closeSocket(socket); } catch (Exception e) { e.printStackTrace(); } } return result; } private static void closeOutputStreamWriter(OutputStreamWriter osw) throws IOException { if (osw != null) { osw.close(); } } private static void closeInputStream(InputStream is) throws IOException { if (is != null) { is.close(); } } private static void closeSocket(Socket socket) throws IOException { if (socket != null) { socket.close(); } } public static String streamToString(InputStream is) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } baos.close(); is.close(); byte[] byteArray = baos.toByteArray(); return new String(byteArray); } catch (Exception e) { return null; } } }
关于java网络编程中获取输入流中数据的问题?
//服务器端接收消息的类。定制端口号为8888 serviceSocket = new ServerSocket(10000); //获取socket。这个方法是阻塞式的 socket = serviceSocket.accept(); inputStream = socket.getInputStream(); byte buf[] = new byte[1024]; int len = 0; len =inputStream.read(buf); //打印客户端的消息 System.out.println(new String(buf,0,len)); //向客户端生成响应 outputStream = socket.getOutputStream(); outputStream.write("收到".getBytes()); 使用如上代码没然后问题。服务端可以获取客户端的数据。客户端也可以获取服务端的响应。但如果把其中inputStream的读取数据方式改为如下: while((len=inputStream.read(buf))>0){ //此处拼接客户端的消息 } //在循环外向客户端相应 outputStream = socket.getOutputStream(); outputStream.write("收到".getBytes()); 此时就会出错。服务端无法获取客户端的数据。客户端也无法获取服务端的响应。通过一个循环来不断读取流中的数据是io流的通常做法。为什么这儿不行。。。求解。
socket客户端输出流已关闭,为何服务端还可以写数据?
客户端代码: //1,创建客户端socket。 Socket s = new Socket("172.18.24.57",10006); //2,读取客户端要上传的图片文件。 FileInputStream fis = new FileInputStream("c:\\0.bmp"); //3,获取socket输出流,将读到图片数据发送给服务端。 OutputStream out = s.getOutputStream(); byte[] buf = new byte[1024]; int len = 0; while((len=fis.read(buf))!=-1){ out.write(buf,0,len); } s.shutdownOutput(); //读取服务端发回的内容。 InputStream in = s.getInputStream(); byte[] bufIn = new byte[1024]; int lenIn = in.read(buf); String text = new String(buf,0,lenIn); System.out.println(text); fis.close(); s.close(); 服务端代码: ServerSocket ss = new ServerSocket(10005); //2, Socket s = ss.accept(); System.out.println(s.getInetAddress().getHostAddress()+".....connected"); //3, BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); //4, BufferedWriter bufw = new BufferedWriter(new FileWriter("c:\\server.txt")); String line = null; while((line=bufIn.readLine())!=null){ // if("over".equals(line)) // break; bufw.write(line); bufw.newLine(); bufw.flush(); } PrintWriter out = new PrintWriter(s.getOutputStream(),true); out.println("上传成功"); bufw.close(); s.close(); ss.close(); http://ask.csdn.net/# 问题描述:客户端执行 s.shutdownOutput();已经关闭了socket输出流,为什么服务端还可以向socket管道out.println("上传成功");写数据?http://ask.csdn.net/#
Socket的输入输出问题
MyServer.java ``` import java.util.List; import java.util.Collections; import java.util.ArrayList; import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; public class MyServer{ //定义保存所有Socket的ArrayList,并将其包装为线程安全的 public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<>()); public static void main(String[] args) throws IOException{ ServerSocket ss = new ServerSocket(30000); while(true){ //此行代码会阻塞,将一直等待别人的连接 Socket s = ss.accept(); socketList.add(s); //每当客户端连接后启动一个ServerThread线程为该客户端服务 new Thread(new ServerThread(s)).start(); } } } ``` ServerThread ``` import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; //负责处理每个线程通信的线程类 public class ServerThread implements Runnable{ //定义当前线程所处理的Socket Socket s = null; //该线程所处理的Socket对应的输入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException{ this.s = s; //初始化该Socket对应的输入流 br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //采用循环不断地从Socket中读取客户端发过来的数据 while((content = readFromClient()) != null){ //遍历socketList中的每个Socket //将读到的内容向每个Socket发送一次 for(Socket s : MyServer.socketList){ PrintStream ps = new PrintStream(s.getOutputStream()); System.out.println(content); ps.println(content); } } }catch (IOException e){ e.printStackTrace(); } } //定义读取客户端数据的方法 private String readFromClient(){ try{ Thread.sleep(10000); return br.readLine(); } //如果捕获到异常,则表明该Socket对应的客户端已经关闭 catch(Exception e){ //删除该Socket MyServer.socketList.remove(s); } return null; } } ``` MyClient ``` import java.net.Socket; import java.io.PrintStream; import java.io.BufferedReader; import java.io.InputStreamReader; public class MyClient{ public static void main(String[] args) throws Exception{ Socket s = new Socket("127.0.0.1", 30000); //客户端启动ClientThread线程不断地读取来自服务器的数据 new Thread(new ClientThread(s)).start(); //获取该Socket对应的输出流 PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; //不断地读取键盘输入 BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); while((line = br.readLine()) != null){ //将用户的键盘输入内容写入Socket对应的输出流 ps.println(line); } } } ``` ClientThread ``` import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ClientThread implements Runnable{ //该线程负责处理的Socket private Socket s; //该线程所处理的Socket对应的输入流 BufferedReader br = null; public ClientThread(Socket s) throws IOException{ this.s = s; br = new BufferedReader( new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //不断地读取Socket输入流中的内容,并将这些内容打印输出 while((content = br.readLine()) != null){ System.out.println(content); } }catch (Exception e){ e.printStackTrace(); } } } ``` 照着书敲得,实现一个命令行聊天。 问题是:MyClient中控制台输入阻塞,当我输入数据时,ServerThread可以通过Socket的输入流获取数据,而ClientThread中的Socket的输入流不能(这里的输入流是为了获取ServerThread中输出数据的时候才用上)。
Socket断线重连读数据一直处于阻塞状态
最近在做一个通讯的项目,服务器每隔2s发送一个心跳包,客户端也会回一个,确认连接。 但是在客户端多次断线重连后,有一定几率会出现以下状况: 客户端与服务器成功连接,同时客户端可以接收到服务器发送的心跳包,但不发送返回包。 同时客户端任何信息都无法发送。 经过测试已知服务器在读输入流时被阻塞。 连接是用Socket获取输入输出流做的。 求问有没有谁知道问题在哪儿?
一个悲催的菜鸟,关于安卓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 socket 聊天程序中如何把线程1的文本传到其他线程中
服务器端的代码: package 实验室项目一; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; import java.net.InetAddress; public class Server { public static void main(String[] args) { try { //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket=new ServerSocket(10086); Socket socket=null; //记录客户端的数量 int count=0; System.out.println("***服务器即将启动,等待客户端的连接***"); //循环监听等待客户端的连接 while(true){ //调用accept()方法开始监听,等待客户端的连接 socket=serverSocket.accept(); //创建一个新的线程 ServerThread serverThread=new ServerThread(socket); //启动线程 serverThread.start(); count++;//统计客户端的数量 System.out.println("客户端的数量:"+count); InetAddress address=socket.getInetAddress(); System.out.println("当前客户端的IP:"+address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } } package 实验室项目一; /** * 服务器线程处理类 */ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class ServerThread extends Thread { // 和本线程相关的Socket Socket socket = null; public ServerThread(Socket socket) { this.socket = socket; } //线程执行的操作,响应客户端的请求 public void run(){ String msg;//客户端的消息 DataInputStream is=null; DataOutputStream os=null; try { //获取输入流,并读取客户端信息 is = new DataInputStream(socket.getInputStream()); msg=is.readUTF(); //获取输出流,响应客户端的请求 os = new DataOutputStream(socket.getOutputStream()); os.writeUTF(msg);//注意 啊,写到这儿不知道怎么把数据传到其他的线程中 } catch (IOException e) { e.printStackTrace(); }finally{ //关闭资源 try { if(is!=null) is.close(); if(socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
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(); } } } } } ``` ```
URLConnection 连接 ServerSocket 无法获取流里面的数据?
Service端 ``` public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(9999); Socket socket = serverSocket.accept(); socket.setSoTimeout(20000); OutputStream out = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); Reader reader = new InputStreamReader(inputStream); char chars[] = new char[512]; int len; while ((len = reader.read(chars)) != -1) { String str = new String(chars, 0, len); System.out.println(str); } System.out.println("--------------------"); socket.close(); } ``` Client 端 ``` public static void main(String[] args) throws Exception { URL url = new URL("http://127.0.0.1:9999/work"); URLConnection con = url.openConnection(); con.setDoOutput(true); con.setDoInput(true); OutputStream out = con.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())); out.write("Hello World".getBytes()); out.flush(); // String line = ""; // for (line = br.readLine(); line != null; line = br.readLine()) { // System.out.println(line); // } out.close(); } ``` Server端输出: POST /work HTTP/1.1 User-Agent: Java/1.6.0_45 Host: 127.0.0.1:9999 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Content-type: application/x-www-form-urlencoded Content-Length: 0 ------------------- 没有输出Hello World! 求解
初学Java网络编程socket,为何我的服务器打不开?
初学Java网络编程socket,写了个服务器,但是打不开,求指导。代码如下 ``` import java.io.*; import java.net.*; import java.util.*; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.stage.Stage; public class Test2_2Server extends Application{ //创建显示文本域 private TextArea area = new TextArea(); public void start(Stage primaryStage){ area.setEditable(false); Scene scene = new Scene(new ScrollPane(area), 450,300); primaryStage.setTitle("Test2_2Server"); primaryStage.setScene(scene); primaryStage.show(); try { //创建一个服务器套接字 ServerSocket serverSocket = new ServerSocket(8800); Platform.runLater(() -> area.appendText("Server started at " + new Date() + '\n')); int clientNo = 1; while (true){ //监听 Socket socket = serverSocket.accept(); area.appendText("Starting thread for client " + clientNo + " at " + new Date() + '\n'); //获取客户端地址 InetAddress inetAddress = socket.getInetAddress(); area.appendText("Client " + clientNo + "'s host name is " + inetAddress.getHostName() + '\n'); area.appendText("Client " + clientNo + "'s IP Address is " + inetAddress.getHostAddress() + '\n'); //创建进程 HandleAClient task = new HandleAClient(socket); //开始运行 new Thread(task).start(); //客户端数加一 clientNo++; } } catch(IOException ex) { System.err.println(ex); } } public static void main(String[] args) { launch(args); } //服务器端的任务类 class HandleAClient implements Runnable{ private Socket socket; public HandleAClient(Socket socket1){ this.socket = socket1; } public void run(){ try { //创建输入输出流 DataInputStream inputFromClient = new DataInputStream(socket.getInputStream()); DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream()); while (true){ //获取客户端数据 double annualInterestRate = inputFromClient.readDouble(); int numberOfYears = inputFromClient.readInt(); double loanAmount = inputFromClient.readDouble(); //计算偿还额 double totalPayment = loanAmount * Math.pow(1 + annualInterestRate * 0.01, numberOfYears); double monthlyPayment = totalPayment / numberOfYears / 12; //将数据传送至客户端 outputToClient.writeDouble(monthlyPayment); outputToClient.writeDouble(totalPayment); //输出 Platform.runLater(() ->{ area.appendText("Annual Interest Rate:" + annualInterestRate + '\n'); area.appendText("Number Of Year:" + numberOfYears + '\n'); area.appendText("Loan Amount:" + loanAmount + '\n'); area.appendText("Monthly Payment:" + monthlyPayment + '\n'); area.appendText("Total Payment:" + totalPayment + '\n'); }); } } catch (IOException ex) { ex.printStackTrace(); } } } } ```
socket TCP通讯 客户端一直循环输出welcome 求挑错
1.import java.io.*; import java.net.*; public class Server { public static final int PORT=8888; public static void main(String[] args) throws IOException{ ServerSocket ss=new ServerSocket(PORT); System.out.println(ss); try{ //记录客户端的数量 int count=0; System.out.println("***服务器即将启动,等待客户端的连接***"); //循环监听,等待客户端的连接 while(true){ Socket socket=ss.accept(); //创建新线程 ServerThread serverThread=new ServerThread(socket); //启动线程 serverThread.start(); count++; System.out.println("客户端的数量:"+count); InetAddress address=socket.getInetAddress(); System.out.println("当前客户端的IP:"+address.getHostAddress()); } }catch(IOException e){ e.printStackTrace(); }finally{ ss.close(); } } } 2.import java.io.*; import java.net.*; /* * 服务器线程处理类 */ public class ServerThread extends Thread{ //和本线程相关的socket Socket socket=null; public ServerThread(Socket socket) { this.socket = socket; } //线程执行的操作,响应客户端的请求 @Override public void run() { BufferedReader in=null; PrintWriter out=null; try{ //获取输入输出流 in=new BufferedReader( new InputStreamReader( socket.getInputStream())); String info=null; while((info=in.readLine())!=null){ System.out.println("我是服务器,客户端说"+info); } socket.shutdownInput(); out=new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()))); out.println("welcome!"); out.flush();//调用flush()方法将缓冲输出 }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(in!=null) in.close(); if(out!=null) out.close(); }catch(IOException e){ e.printStackTrace(); } } } } 3.import java.io.*; import java.net.*; /* * 客户端 */ public class Client { public static void main(String[] args)throws IOException { Socket socket=new Socket("localhost",Server.PORT); try{ BufferedReader in=new BufferedReader( new InputStreamReader( socket.getInputStream())); PrintWriter out=new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()))); out.println("用户名:mtone;密码:123"); out.flush(); //flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满 socket.shutdownOutput(); String info=null; info=in.readLine(); while(info!=null){ System.out.println("我是客户端,服务器说:"+info); } }catch(IOException e){ e.printStackTrace(); }finally{ socket.close(); } } } ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510915294_669759.png) ![图片说明](https://img-ask.csdn.net/upload/201711/17/1510915305_978328.png)
Android socket通讯客户端连不上服务器问题,以及发送消息程序就闪退
原本以为是线程问题但是好像又不是,实在找不到怎么弄了 这是客户端: package com.chiaki.mysocketobject; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ChatActivity extends AppCompatActivity implements Runnable{ private static final String HOST = "172.16.2.54"; private static final int PORT = 12345; private MsgAdapter adapter; private ListView msgListView; private List<Msg> msgList=new ArrayList<Msg>(); private ImageButton send; private ImageButton connect; private EditText edit; private TextView ctext; private Socket socket; private BufferedReader in = null; private PrintWriter out = null; private String content = ""; private StringBuilder sb = null; public Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 0x123) { sb.append(content); ctext.setText(sb.toString()); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); adapter=new MsgAdapter(ChatActivity.this,R.layout.chat_list_view,msgList); ImageButton back = (ImageButton)findViewById(R.id.back); ImageButton voiceButton = (ImageButton)findViewById(R.id.voiceButton); connect = (ImageButton)findViewById(R.id.connectButton); send = (ImageButton)findViewById(R.id.send); edit = (EditText)findViewById(R.id.edit); ctext = (TextView)findViewById(R.id.chattext); msgListView=(ListView)findViewById(R.id.msg_list_view); sb = new StringBuilder(); msgListView.setAdapter(adapter); // 点击按钮实例化Socket对象,与服务端进行连接,获取输入输出流 // 连接服务器,要在子线程中 connect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread() { @Override public void run() { super.run(); try { // 创建socket,连接服务器 socket = new Socket(HOST, PORT);//连接服务器 in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));//接收消息的流对象 out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);//发送消息的流对象 } catch (Exception e) { e.printStackTrace(); } } }.start(); } }); back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ChatActivity.this,SocketActivity.class); startActivity(intent); } }); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String con=edit.getText().toString(); edit.setText(""); if (socket.isConnected()) { if (!socket.isOutputShutdown()) { out.println(con);//点击按钮发送消息 } } } }); //启动线程,连接服务器,并用死循环守候,接收服务器发送过来的数据 new Thread(ChatActivity.this).start(); } // 重写run方法,在该方法中输入流的读取 public void run() { try { while (true) { //死循环守护,监控服务器发来的消息 if (socket.isConnected()) { //如果服务器没有关闭 if (!socket.isInputShutdown()) { //连接正常 if ((content = in.readLine()) != null) { //如果输入流没有断开 content += "\n"; //读取接收的信息 handler.sendEmptyMessage(0x123); //会发送一个空消息,但是指定了Message的what属性 } } } } } catch (Exception e) { e.printStackTrace(); } } } 这是layout文件主要的控件: <ImageButton //建立连接按钮 android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@android:drawable/checkbox_on_background" android:id="@+id/connectButton" android:layout_alignParentStart="true" android:layout_below="@+id/edit" /> <TextView //显示消息 android:text="TextView" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/chattext" /> <ImageButton //编辑消息 android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@android:drawable/ic_btn_speak_now" android:id="@+id/voiceButton" android:layout_below="@+id/edit" android:layout_centerHorizontal="true" /> <ImageButton //发送消息 android:layout_width="wrap_content" android:layout_height="40dp" app:srcCompat="@android:drawable/ic_menu_send" android:id="@+id/send" android:backgroundTint="?attr/colorButtonNormal" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" /> 这是服务端: import java.io.DataInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { // 定义相关的参数,端口,存储Socket连接的集合,ServerSocket对象 // 以及线程池 private static final int PORT = 12345; private List<Socket> mList = new ArrayList<Socket>(); private ServerSocket server = null; private ExecutorService myExecutorService = null; public static void main(String[] args) { new Server(); } public Server() { try { server = new ServerSocket(PORT); // 创建线程池 myExecutorService = Executors.newCachedThreadPool(); System.out.println("服务端运行中...\n"); Socket client = null; while (true) { client = server.accept(); mList.add(client); myExecutorService.execute(new Service(client)); } } catch (Exception e) { e.printStackTrace(); } } class Service implements Runnable { private Socket socket; private BufferedReader in = null; private String msg = ""; public Service(Socket socket) { this.socket = socket; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("用户:" + this.socket.getInetAddress() + "~加入了聊天室" + "当前在线人数:" + mList.size()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { while (true) { if ((msg = in.readLine()) != null) { if (msg.equals("bye")) { System.out.println("~~~~~~~~~~~~~"); mList.remove(socket); in.close(); System.out.println("用户:" + socket.getInetAddress() + "退出:" + "当前在线人数:" + mList.size()); socket.close(); break; } else { System.out.println(socket.getInetAddress() + " 说: " + msg); this.sendmsg(); } } } } catch (Exception e) { e.printStackTrace(); } } // 为连接上服务端的每个客户端发送信息 public void sendmsg() { int num = mList.size(); for (int index = 0; index < num; index++) { Socket mSocket = mList.get(index); PrintWriter pout = null; try { pout = new PrintWriter( new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true); pout.println(msg); } catch (IOException e) { e.printStackTrace(); } } } } }
Java web 调用cgi发送form表达数据,如何获取返回值?
各位,大家好,有个问题想请教一下,目前一套java web开发的网站,需要调用外公司 提供的一个cgi接口,用于实现发送一个字符串(包含了几个字段的数据)给他们的cgi 脚本,我们发送不论成功或者失败,他们都会返回一个具体的int值给我们,我该如何发 送并获取返回值?网上看到的资料不是特别多,自己大概的思路如下: //jsp要调用的程序为AgentRetMaintainerAct.cgi URL u = new URL("http://www.****.com.cn/***/cgi-bin/AgentRetMaintainerAct.cgi"); //urlc表示 URL 的连接对象 URLConnection urlc = u.openConnection(); //指示应用程序要从 URL 连接读取数据 urlc.setDoOutput(true); urlc.setDoInput(true); //允许用户交互。 urlc.setAllowUserInteraction(true); //输出流getoutputstream,用于向socket端发送数据,就是发送消息用的 DataOutputStream server = new DataOutputStream(urlc.getOutputStream()); //调用cgi通过http的post方式发送字符串到cgi server.writeBytes(totol); server.close(); 但是现在我不知道这样处理是否正确,也不明确如何获取对方的返回值? 烦请高手帮忙看看,该如何处理。语句要如何实现?非常感谢!!!
C#怎样用socket传输自己定义的一个类的对象
如题。。怎样传输一个对象。 MemoryStream mStream = new MemoryStream(); mStream.Position = 0; while (true) { int ReceiveCount = clientSocket.Receive(result,1024,0); if (ReceiveCount == 0) { break;//接收到的字节数为0时break } else { MessageBox.Show("成功获取到数据"); mStream.Write(result, 0, ReceiveCount); //将接收到的数据写入内存///流 } } 百度到一种方法是这样。可是ReceiveCount值出现过两次。一次为1024,一次为0.所以一直没有退出循环
springcloud Hoxton.SR1 在网关中添加 zipkin 配置后报错 This converter does not support this method 应该如何解决
pom.xml 配置 ``` <dependencies> <!--微服务注册--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--网关配置--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!--限流--> <!-- https://mvnrepository.com/artifact/com.marcosbarbero.cloud/spring-cloud-zuul-ratelimit --> <dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>spring-cloud-zuul-ratelimit</artifactId> <version>2.3.0.RELEASE</version> </dependency> <!--限流redis数据库记录数据--> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--OAuth--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--自定义config配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> <!-- 被zipkin服务追踪的启动依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <!--配置rabbitmq--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> </dependencies> ``` application.yml ``` server: port: 6020 spring: application: name: Gateway-Zuul #对曝光的微服务的名称 #配置redis redis: host: 127.0.0.1 port: 6379 password: admin jedis: pool: max-active: 100 max-idle: 8 min-idle: 4 max-wait: 10000 timeout: 3000 #rabbitmq rabbitmq: host: 127.0.0.1 port: 5672 username: admin password: admin #zipkin在rabbitmq消息队列zipkin zipkin: sender: type: rabbit rabbitmq: queue: zipkin #被追踪的可能性,默认是0.1 表示百分之10 sleuth: sampler: probability: 1.0 eureka: client: service-url: defaultZone: http://Eureka7001.com:7001/eureka/ registry-fetch-interval-seconds: 5 # 默认为30秒 表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒 instance: instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}} #修改之后的ip prefer-ip-address: true #访问路径显示IP地址 zuul: host: connect-timeout-millis: 15000 #HTTP连接超时要比Hystrix的大 socket-timeout-millis: 60000 #socket超时 ignored-services: "*" # 不允许用微服务名访问了,如果禁用所有的,可以使用 "*" routes: OAuth-server: /auth/** sensitive-headers: #允许传递敏感信息 #限流配置 ratelimit: enabled: true repository: REDIS behind-proxy: true add-response-headers: false default-policy-list: #optional - will apply unless specific policy exists - limit: 20 #optional - request number limit per refresh interval window quota: 1 #optional - request time limit per refresh interval window (in seconds) refresh-interval: 1 #default value (in seconds) type: #optional # - user - origin - url - httpmethod security: oauth2: client: #令牌端点 access-token-uri: http://localhost:${server.port}/auth/oauth/token #授权端点 user-authorization-uri: http://localhost:${server.port}/auth/oauth/authorize #OAuth2客户端ID client-id: test #OAuth2客户端密钥 client-secret: test authorization: check-token-access: http://localhost:${server.port}/auth/oauth/check_token resource: jwt: key-value: jkdfjkdf ribbon: ReadTimeout: 10000 ConnectTimeout: 10000 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 3000 circuitBreaker: enabled: true requestVolumeThreshold: 10 sleepWindowInMilliseconds: 10000 errorThresholdPercentage: 60 ``` 报错信息: ``` 2020-02-09 17:04:44.448 ERROR [Gateway-Zuul,bb484313c41a709a,0245f4527d3b0826,true] 20368 --- [ask-scheduler-1] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessagingException: Failed to invoke method; nested exception is java.lang.UnsupportedOperationException: This converter does not support this method at org.springframework.integration.endpoint.MethodInvokingMessageSource.doReceive(MethodInvokingMessageSource.java:115) at org.springframework.integration.endpoint.AbstractMessageSource.receive(AbstractMessageSource.java:167) at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:250) at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:359) at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:328) at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$null$1(AbstractPollingEndpoint.java:275) at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute$0(ErrorHandlingTaskExecutor.java:57) at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55) at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$createPoller$2(AbstractPollingEndpoint.java:272) at org.springframework.cloud.sleuth.instrument.async.TraceRunnable.run(TraceRunnable.java:67) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.UnsupportedOperationException: This converter does not support this method at org.springframework.integration.support.converter.DefaultDatatypeChannelMessageConverter.toMessage(DefaultDatatypeChannelMessageConverter.java:85) at org.springframework.messaging.converter.CompositeMessageConverter.toMessage(CompositeMessageConverter.java:83) at org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry$FunctionInvocationWrapper.lambda$convertOutputValueIfNecessary$2(BeanFactoryAwareFunctionRegistry.java:620) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1359) at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126) at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:499) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:486) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464) at org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry$FunctionInvocationWrapper.convertOutputValueIfNecessary(BeanFactoryAwareFunctionRegistry.java:626) at org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry$FunctionInvocationWrapper.doApply(BeanFactoryAwareFunctionRegistry.java:569) at org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry$FunctionInvocationWrapper.get(BeanFactoryAwareFunctionRegistry.java:474) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:266) at org.springframework.integration.endpoint.MethodInvokingMessageSource.doReceive(MethodInvokingMessageSource.java:112) ... 19 moreyi ```
android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢?
``` public class MainActivity extends ActionBarActivity { private EditText edOwnPort; private TextView tvOwnIP; SurfaceView sView; SurfaceHolder surfaceHolder; int screenWidth,screenHeight; Camera camera; boolean isPreview=false; private String ipname; @Override protected void onCreate(Bundle savedInstanceState) { //设置全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edOwnPort=(EditText)findViewById(R.id.edOwnPort); tvOwnIP=(TextView)findViewById(R.id.tvOwnIP); sView=(SurfaceView)findViewById(R.id.sView); surfaceHolder=sView.getHolder();//获得surfaceview的surfaceHolder screenWidth=640; screenHeight=480; ipname=getLocalIpAddress(); tvOwnIP.setText(ipname); //为surfaceHolder添加一个回调监听器 surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { initCamera();//初始化摄像头,并打开摄像头 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { //如果camera不为null,释放摄像头 if (camera!=null){ if (isPreview) camera.stopPreview(); camera.release(); camera=null; } System.exit(0);//退出程序 } }); //设置该SurfaceView自己不维护缓冲 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } private String getLocalIpAddress() { //获取本机IP地址 try{ for (Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){ NetworkInterface intf=en.nextElement(); for (Enumeration<InetAddress> enumlpAddr=intf.getInetAddresses();enumlpAddr.hasMoreElements();){ InetAddress inetAddress=enumlpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()){ return inetAddress.getHostAddress().toString(); } } } }catch (SocketException ex){ Log.e("WifiPreference Ip",ex.toString()); } return null; } private void initCamera(){ if (!isPreview){ camera=Camera.open();//打开摄像头 } if (camera!=null&&!isPreview){//摄像头已打开,但还没有进行预览 try{ Camera.Parameters parameters=camera.getParameters(); parameters.setPreviewSize(screenWidth, screenHeight);//设置预览照片的大小 parameters.setPreviewFpsRange(20, 30);//设置每秒显示20~30帧 parameters.setPictureFormat(ImageFormat.NV21);//设置图片格式 parameters.setPictureSize(screenWidth, screenHeight);//设置照片的大小 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);//设置对焦模式 camera.setPreviewDisplay(surfaceHolder);//通过SurfaceView显示取景画面 camera.setPreviewCallback(new StreamIt(ipname));//设置回调 的类 camera.setDisplayOrientation(90);//让预览图像旋转90°,手机camera sensor默认是横屏 camera.startPreview();//开始预览 }catch (Exception e){ e.printStackTrace(); } isPreview=true;//开启预览后,给预览标志符true } } class StreamIt implements Camera.PreviewCallback{ private String ipname; public StreamIt(String ipname){ this.ipname=ipname; } @Override public void onPreviewFrame(byte[] data,Camera camera){ Size size=camera.getParameters().getPreviewSize(); try{ YuvImage image=new YuvImage(data,ImageFormat.NV21,size.width,size.height,null); if (image!=null){ ByteArrayOutputStream outstream=new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0,0,size.width,size.height),80,outstream); outstream.flush(); Thread th=new MyThread(outstream,ipname); th.start(); } }catch (Exception ex){ Log.e("Sys", "Error:" + ex.getMessage()); } } } class MyThread extends Thread{ private int Port=Integer.parseInt(edOwnPort.getText().toString()); private byte byteBuffer[]=new byte[1024]; private OutputStream outsocket; private ByteArrayOutputStream myoutputstream; private String ipname; private ServerSocket ss; private Socket tempSocket; public MyThread(ByteArrayOutputStream myoutputstream,String ipname){ this.myoutputstream=myoutputstream; this.ipname=ipname; try{ myoutputstream.close(); }catch (IOException e){ e.printStackTrace(); } } public void run(){ try{ ss=new ServerSocket(Port); tempSocket = ss.accept(); outsocket = tempSocket.getOutputStream();//socket获得输出流 ByteArrayInputStream inputStream=new ByteArrayInputStream(myoutputstream.toByteArray()); int amount; while ((amount=inputStream.read(byteBuffer))!=-1){ //这个方法是先规定一个数组长度,将这个流中的字节缓冲到数组byteBuffer中,返回的是这个数组中的字节个数,这个缓冲区没有满的话,则返回真实的字节个数,到未尾时都返回-1 outsocket.write(byteBuffer,0,amount); //write(byte[] b, int off, int len): 将指定 byteBuffer数组中从偏移量 off 开始的 len 个字节写入此输出流,此处是: 上面把myoutputstream->inputStream->byteBuffer,并获得长度amount->把byteBuffer写入输出流outsocket } myoutputstream.flush(); //myoutputstream.reset(); myoutputstream.close(); //tempSocket.close(); }catch(IOException e){ e.printStackTrace(); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } ``` 想实现的是,一启动程序就进入一直预览的状态,并等待socket的连接请求,一旦有请求过来,server端新建立一个socket去通信,然后将获取的每一帧图像,完整的通过socket发送出去,现在是可以实现预览,但连上socket后只发一次图像数据就没动静了,这时什么原因,在run()那段代码里调试了很久还是不行,求解 ?
android蓝牙Socket.connect失败,socket might be closed
代码如下,测试发现toast直到“mmsocket成功”都是有的,mmSocket.connect(); 那失败了,抛出“连接服务端异常2” protected void onResume() { if(BluetoothMsg.isOpen) { Toast.makeText(mContext, "连接已经打开,可以通信。如果要再建立连接,请先断开!", Toast.LENGTH_SHORT).show(); return; } // 如果点选了远程设备去连接,则本机是客户端, 开启客户端线程,接收输入流数据 if(BluetoothMsg.serviceOrCilent==BluetoothMsg.ServerOrCilent.CLIENT) { String address = BluetoothMsg.BlueToothAddress; //将在UI界面选中连接的蓝牙地址赋给address if(!address.equals("null")) //如果蓝牙地址不为空 { //在mainactivity中的get到的本地蓝牙适配器实例化成了blueadapter,在这个activity中在开头实例化成了 mBluetoothAdapter,但是它们是同一个 device = mBluetoothAdapter.getRemoteDevice(address);//根据蓝牙地址获取远程蓝牙设备 // mBluetoothAdapter.cancelDiscovery(); if (device != null) { Toast.makeText(mContext, "device成功 !", Toast.LENGTH_SHORT).show(); } clientConnectThread = new clientThread(device); //新建并启动一个客户端线程 clientConnectThread.start(); BluetoothMsg.isOpen = true; //将BluetoothMsg类里的isOpen常量改为true } else { Toast.makeText(mContext, "蓝牙地址为空 !", Toast.LENGTH_SHORT).show(); } } // 如果本机是服务器,开启服务端线程,也接收输入流数据 else if(BluetoothMsg.serviceOrCilent==BluetoothMsg.ServerOrCilent.SERVICE) { } super.onResume(); } //2开启客户端 读取数据 private class clientThread extends Thread { private final BluetoothSocket mmSocket; public clientThread(BluetoothDevice device) { BluetoothSocket tmp = null; try { tmp = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); } catch (IOException e) { Log.e("connect", "", e); Message msg = new Message(); msg.obj = "连接服务端异常1!断开连接重新试一试。"; msg.what = 0; LinkDetectedHandler.sendMessage(msg); } mmSocket = tmp; if (mmSocket!= null){ Toast.makeText(mContext, "mmSocket成功", Toast.LENGTH_SHORT).show(); } } public void run() { mBluetoothAdapter.cancelDiscovery(); try { mmSocket.connect(); } catch (IOException e) { Log.e("connect", "", e); Message msg = new Message(); msg.obj = "连接服务端异常2!断开连接重新试一试。"; msg.what = 0; LinkDetectedHandler.sendMessage(msg); return; } } }
java与delphi之间的文件传输问题
使用socket进行通信 delphi作为客户端中使用的是文件流TfileStream传送文件 java作为服务端用的InputStreamReader获取 悲催的问题来了 服务端获取不到文件中的末尾也就是说不知道文件传输是否结束 文件传完了也一直连着 后来使用一个比较笨的办法解决 用新建了一个缓存区buf去取数据一次只取一部分 当buf取到的值不满时就判断文件传输完成… 所以悲催的新问题又来了 文件还只是传一部分就结束了 所以想请问一下各位大牛们如何解决这个文件传输的问题? 亦或者有什么其它的传输方式?
关于建立一个TCP服务端出现阻塞问题
************************************ 这里是tcp客户端的代码 ************************************ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Socket_client { public static void main(String[] args) throws UnknownHostException, IOException { //first,创建一个socket对象 Socket s = new Socket("192.168.1.107",20000); //second,获取Socket中的输出流 OutputStream out = s.getOutputStream(); //third,发送信息 out.write("嘿嘿嘿".getBytes()); //添加读取服务器返回信息功能 //使用socket流读取服务器返回数据 InputStream in = s.getInputStream(); byte[] b = new byte[1024]; int len = in.read(b); String str = new String(b,0,len); System.out.println(str); //关闭资源 s.close(); } } ************************************ 这里是tcp服务端的代码 ************************************ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server_Socket { public static void main(String[] agrs) throws IOException{ //先建立一个服务Socket ServerSocket ss = new ServerSocket(20000); //获取客户Socket对象 Socket s = ss.accept(); //使用客户的Socket对象将信息打印出来 InputStream in = s.getInputStream(); byte[] b = new byte[1024]; int len; while((len = in.read(b))!=-1){ //问题就出在这里,用循环读取,读取-1时,出现阻塞,后面代码无法运行 String str = new String(b,0,len); System.out.println(str); } //使用客户的Socket对象将成功接受信息的信息反馈给客户端 OutputStream out = s.getOutputStream(); out.write("成功接受到信息".getBytes()); //关闭资源 s.close(); ss.close(); } } 先执行了服务端,然后再执行客户端,服务端收到客户端发来的string后阻塞了,客户端也阻塞了,无法接受服务端回复的string 如果我把服务端循坏代码改成如下: //使用客户的Socket对象将信息打印出来 InputStream in = s.getInputStream(); byte[] b = new byte[1024]; int len = in.read(b); String str = new String(b,0,len); System.out.println(str); -------------------------------------------------- 程序能正常运行,为何,求解?
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
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。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
C语言荣获2019年度最佳编程语言
关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang近日,TIOBE官方发布了2020年1月编程语言排行榜单。我在前面给过一篇文章《2019年11月C语言接近Ja...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的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 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问