android socket问题,第一次发数据很慢

我建立的socket在刚连接上网络助手的时候,为什么第一次发消息很慢(很少情况下能正常发送)第一次发送成功后再发送就很快。我知道应该和socket的内部实现机制有关,但不知道为什么。有没有大神帮解释下?谢谢,谢谢,谢谢。下面是发送数据的代码,发的数据是十六进制。

public void send_data(){
String temp = "";

            try {
                    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(Caller.socket.getOutputStream())),true);
            } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }                        
            for(int i=0; i<data.length; i++)
            {
                    temp +=(char) data[i];
            }
            out.printf(temp);
            //out.println(data);

    }

4个回答

我个人的理解:TCP是面向连接的通信协议,通过三次握手建立连接,刚开始建立连接的时间较长,而完成连接之后,就只需要发送东西。

抓包看看 ,是在建立连接的时候慢,还是真正的在发送第一包数据的时候慢。

max_min_
max_min_ 回复升2: 你是如何知道第一次很慢的呢?抓的数据截图出来看看,怀疑是不是建立连接成功到发送数据之间哪里阻塞了?
接近 5 年之前 回复
u013033086
升2 建立连接的时候挺快的,就是第一次发数据的时候很慢才能发出去,只要第一次发送完了,再发就很快了。
大约 5 年之前 回复

我觉得应该是你的程序造成的问题,而不是所谓的第一次发送慢

u013033086
升2 我程序也挺简单的,就是在另一个线程连接socket,连接成功以后在UI界面线程里点发数据按钮,此时按钮会按下一会(2~10S不定),数据发送完了弹起来。这一次发过后再发就发的很快了
大约 5 年之前 回复

网络数据如果你这里没有控制速度肯定是对方控制的,第一次说明连接花费时间很长,问题应该出在你的网络助手上,自己写个demo调试一下

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

Android Socket发送数据遇到的奇怪问题

向各位大虾求救!!! 写一段简单的Android网络通讯程序,发现总是发送数据发了100上下字节(每次8个字节),然后就发不出去了,但是也没有任何异常抛出,检查所有状态都正常。 有谁知道这可能是什么情况? 连接代码是这样的: mSocket=new Socket(mStrIP, mPort); mSocket.setTcpNoDelay(true); // disable Nagle algorithm mSocket.setKeepAlive(true); mInputStream=mSocket.getInputStream(); mOutputStream = mSocket.getOutputStream(); 数据发送代码。(所有错误日志都没有打印出来) if (socket.isOutputShutdown()) Log.e(TAG, "Output is Shutdown"); if (socket.isInputShutdown()) Log.e(TAG, "Input is Shutdown"); if (socket.isClosed()) Log.e(TAG, "Socket is closed"); if (!socket.isConnected()) Log.e(TAG, "Socket is disconnected"); mOutputStream.write(data); mOutputStream.flush(); 建立网络连接和发送数据都是在同一个后台服务的子线程通过handle的形式处理。 网络环境就是WiFi

Android socket通信,数据读取。

public class ChatRoom extends ActionBarActivity { protected TextView tv_chat_show; protected EditText ed_chat_input; protected Button btn_send; protected ActionBarActivity that; protected String receiverMsg; protected String sendStr; protected Socket socket; protected boolean flag; protected boolean isClicked; // 创建handle 对象处理接受数据 Handler myHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); tv_chat_show.append("server: " + msg.obj.toString() + "\n"); Log.i("show", msg.obj.toString()); } }; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.chat_room); tv_chat_show = (TextView) findViewById(R.id.tv_chat_show); ed_chat_input = (EditText) findViewById(R.id.ed_chat_input); btn_send = (Button) findViewById(R.id.btn_send); that= this; // 套接字是否存在标志 flag = false; // 按钮是否点击标志 isClicked = false; // 建立线程连接socket new Thread(){ @Override public void run() { super.run(); socket = new Socket(); try { socket.connect(new InetSocketAddress("10.1.11.38", 443), 5000); flag = true; } catch (IOException e) { e.printStackTrace(); } } }.start(); // 创建套接字发送线程 Thread threadSend = new Thread(){ @Override public void run() { super.run(); try { // 等待1秒确保套接字建立完成 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } DataOutputStream dos; //套接字存在并且点击发送按钮 while(flag) { if(isClicked) { try { dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF(sendStr); isClicked = false; dos.close(); Toast.makeText(that,"发送" + sendStr,Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } } } }; // 创建套接字接受线程 Thread threadRev = new Thread(){ @Override public void run() { super.run(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } DataInputStream dis; while(flag){ try { dis = new DataInputStream(socket.getInputStream()); receiverMsg = dis.readUTF(); Log.i("rev",receiverMsg); Message rM = new Message(); rM.obj = receiverMsg; myHandler.sendMessage(rM); dis.close(); }catch (IOException e){ e.printStackTrace(); } } } }; threadSend.start(); threadRev.start(); btn_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sendStr = ed_chat_input.getText().toString().trim(); ed_chat_input.setText(null); tv_chat_show.append("Client: " + sendStr + "\n"); Log.i("isClicked", "点击"); isClicked = true; } }); } } 测试Log.i("rev",receiverMsg);能够接收到服务器传回来的消息,但是点击发送后软件会崩溃,提示 unfortunately,**** is stoped; Android studio报错信息: 12-22 10:57:34.290 17263-17797/com.teemo.oneteemo E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-931 Process: com.teemo.oneteemo, PID: 17263 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:200) at android.os.Handler.<init>(Handler.java:114) at android.widget.Toast$TN.<init>(Toast.java:342) at android.widget.Toast.<init>(Toast.java:99) at android.widget.Toast.makeText(Toast.java:248) at com.teemo.oneteemo.ChatRoom$3.run(ChatRoom.java:109)

Android socket 相同IP地址不同端口号收接发数据。socket被阻塞

Android 一个线程通过WebVew(URL)获取网页视频,另一个线程通过socket发送命令出去。URL解析出来的 IP地址与socket的IP地址相同。端口号不同。视频可以获取,发送命令一直阻塞在socket初始化。

androidSocket通信TCP接收数据问题

rivate Button send; private TextView rec; private static Socket client; private PrintWriter write; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rec=(TextView)findViewById(R.id.textView3);; Thread aa=new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { //服务器的ip的地址 和端口号 client=new Socket(InetAddress.getByName("192.168.1.101"),4312); BufferedReader read=new BufferedReader (new InputStreamReader(client .getInputStream())); rec.setText("123"); String s = ""; while(true){ s=read.readLine(); rec.setText(s); } } catch(IOException e){ rec.setText("123123"); } } }); aa.start(); } 在 while(true){ s=read.readLine(); rec.setText(s); }为什么只能接收服务器的一次消息第二次手机就会跳出程序

android socket通信读取图片数据,数据出错

我从电脑服务端用imageIO发送了屏幕的截图给android,android端发现如果每次读取 的数据大小超过20K,所得的数据就会出错,我对比了下发送前的图片数据,基本上是 夹杂了很多1K以上的0数据块,又或者是数据块错位。但是一旦把每次读取的数据大小降 低至10K以下又或者增加两次读取间的间隔至500ms以上就能保持数据不出错,这是为什 么呢?

Android Socket服务器线程问题

急!急!急!我是搞java得由于公司有个项目没有android人手,让我做了一个app。马上就要交付测试了,现在遇到这样的问题:启动Android Socket服务端时报错说不让在主线程启动,找了一下相关资料说将线程启动到后台可是不知道怎么改,这是我的代码。 ServerSocket server; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button bt_action = (Button) findViewById(R.id.bt_action); bt_action.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { ServerSocket server = new ServerSocket(); while (true) { // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听9999端口 Socket socket = server.accept(); System.out.println(socket.getInetAddress() .getHostAddress() + "连接进入"); new SocketThread(socket).start(); } } catch (IOException e) { e.printStackTrace(); } } }); } // 一个服务器端口中监听多个客服端通道线程 class SocketThread extends Thread { // 所有通道写入流的集合 private final List<PrintWriter> list = new ArrayList<PrintWriter>(); private BufferedReader bufferedReader; private PrintWriter printWriter; InputStream in = null; public SocketThread(Socket socket) throws IOException { this.bufferedReader = new BufferedReader(new InputStreamReader( socket.getInputStream())); this.printWriter = new PrintWriter(socket.getOutputStream()); this.in = socket.getInputStream(); list.add(printWriter); } @Override public void run() { String string = null; while (true) { try { // 服务器在通道中读到的信息回显给客服端 string = bufferedReader.readLine(); System.out.println("客服端信息:" + string); for (PrintWriter printWriter : list) { // printWriter.write("服务器显示:" + string + "\r\n"); printWriter.flush(); } } catch (IOException e) { } } } }

socket网络传输速度很慢的问题

请问一下各位,我的单个socket连接的socket client 和 server都在同一台电脑上的时候速度极快,20MB/s,为什么把server放到另外一台电脑上其中要经过交换机的时候速度就降到了90kB/s的样子,在同一台电脑上速度快说明发送和接收速度都很快的,而经过交换机以后速度就很慢说明时间是消耗在网络传输上,正常上网下载东西的时候速度不慢大概是5MB/s,请问一下是因为socket还有什么参数没设置吗,速度这么慢 补充一下,刚才我以多个socket通道连接的方式试了一下,连接数为1的时候速度大概为90KB/s,五个socket通道的时候速度大概130kB,20个socket通道的时候速度也是130kB/s,看来增加socket连接个数并不能增加网络传输的速度,我认为是不是交换机把我的应用的socket限速了,哪位见多识广的高手帮忙分析一下,感激不尽,谢谢。

Android Socket通讯问题

用Socket接收数据,点击button启动线程开始接收数据,第一次没有问题,能收到数据,第二次第三次就不行了,连接成功但是没有数据返回,程序正常退出之后再次进入也不行,但是程序异常退出之后第一次点击button接收数据能够成功,之后的又不行了,请问各位前辈该怎么处理

Android socket通信接受不完服务端返回的数据

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(); byte[] a = readStream(socket.getInputStream()); result = new String(a); 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(); } } private static byte[] readStream(InputStream inputStream) throws IOException { int count = 0; while (count == 0) { count = inputStream.available(); } byte[] b = new byte[count]; inputStream.read(b); return b; } }

求教:Android socket通信,发送多条,下面是代码

个人写了一个Android Socket的简单通信代码,就是客户端往服务端发送两条数据,但是服务端在接收第二条数据的时候提示socket已关闭连接 客户端代码: Socket socket = new Socket("192.168.56.1", 8888); DataOutputStream dos=new DataOutputStream(socket.getOutputStream()); dos.writeUTF("我是客户端的数据"); DataInputStream din = new DataInputStream(socket.getInputStream()); String msg = din.readUTF(); DataOutputStream dos2=new DataOutputStream(socket.getOutputStream()); dos2.writeUTF("我是客户端的数据22222"); Toast.makeText(SocketActivity.this, msg, Toast.LENGTH_LONG).show(); 服务端代码: while (true) { socket = ss.accept(); System.out.println("Cilent Connected..."); while(true){ DataInputStream din=new DataInputStream(socket.getInputStream()); String string=din.readUTF(); System.out.println(string); din.close(); DataOutputStream dout = new DataOutputStream(socket.getOutputStream()); String str = "服务端发送的数据"; dout.writeUTF(str); dout.close(); } //socket.close(); }

Android Socket实现语音群聊时的问题

## 我的思路是这样的,客户端 不停地录音,然后发送到服务器,同时客户端也在不停地接收服务端发来的信息,都是用的Socket ,现在问题是在服务端监听 端口,只要一有客户 端链接就将次客户端 Socket存到一个集合中,然后服务端在接收到数据后开始循环遍历集合向所有客户端发信息,但这样一来问题就来了,客户端我自己说的话自己也能听到,导致一片杂音,怎么在服务端屏蔽掉自己的客户端不给自己发信息呢?求大神指教跪谢,这个问题困扰我一周了。项目经理都快发火了,求大神指教

android中UDP socket通信的问题

我使用两个线程,一个用来发送 数据,一个用来接收数据,先开启接收数据线程,接收到数据之后然后回应给对方,但是发送一直停在SocketAddess s=pacakge.getSocketAddess这一步,pacakge是接收到的包.接收线程是这样的: while(true){ socket.receive(packge); }接收到包之后我开启发送线程就卡在上面 那步了,是不是 socket在处于阻塞状态时不能发送数据包啊?

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传送数据怎么得到整型

在接受端的部分代码: InputStream in; String str; byte[] bt=new byte[50]; in.read ( bt ); str=new String ( bt,"UTF-8" ); 这样可以正常在接受端的textview中显示str的中英文以及数字,但我现在想将str转换为整型(在发送端发送的是一串数字),用Integer.parseInt(str);就会出错,请问怎样能得到整型int?

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(); } } } } }

android 客户端socket接收数据时只能接收到1448个字节

byte[] buffer = new byte[1024 * 101]; while ((length = is.read(buffer)) != -1) { byte[] dataInstream = new byte[length]; System.arraycopy(buffer, 0, dataInstream, 0, length); } ```我在使用socket接收数据的时候,new一个缓冲区然后从输入流中读取数据到缓冲区可读到的数据只有1448个字节而实际服务端发送的字节数据流远远大于1448,困扰了几天了,有人能帮我解决这个问题吗 ```

Android Socket 长连接

Socket 长连接,服务器向我发送数据 down, 然后在是up ;再由我下发下去, 现在出现数据是先up,然后才出现down,请问 我现在用什么办法抛弃掉这顺序不正常的数据,只下发数据正常的数据,希望各位大神支招

Android socket连java服务器,Activity之间固定切换8次之后,链接中断

开发一个Android访问sqlserver服务器的app,服务器端用java写服务器端。 android端与服务器端通过socket连接 android socket放在application里面。 各个Activity启动时到application里面读取socket。 在一个activity里面,socket收发数据无论多少次都是正常的。 但同一activiy退出,再进入,重复操作8次以后,再次进入activity就socket连接中断了,这个8次是固定的。 不同activity之间切换8次,也是一样中断。 中断时,android端没有显示异常,java服务器端提示异常,readline读不到数据。 每个activiy启动时开启两个子线程,一个socketReadThread用循环读取数据,退出activity时关闭线程。一个socketWriteThread,用handler发送数据,这个退出时没有关闭。,, 大神帮我看看可能是什么情况。等于是activity之间切换不过8次都是正常的,到了第8次就必定发生中断。 中断的那一次activity启动时,两个子线程看着都是正常启动的,向服务器的发送的数据也是有发出,但是java服务器接收就出错了,但app没有心跳机制(若要问为什么没有,因为不会写啊),可能socket在启动前就已经中断,只是socket还不知道。 Android菜鸟级写手,以前业余写VB6.0的,不是职业程序员,现在硬着头皮写android,一边百度一边写,这个问题卡很久了,求高人们指点一下方向。

android通过socket通信实现客户端读取服务端的二进制数据,并展示在textview控件上

客户端通过socket通信,完成读取服务端的二进制数据读取,并将数据显示在textview控件上,数据全为整型

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c#树形选择 c#中类图的使用方法 c# 传参 调用exe c# 怎么定义方法 c# 修改本地时间 c#前台怎么读取资源文件 c# xml转list c#实现框选截图 m*m乘法表c# c# 乘法99表
立即提问