-
关于socket客户端不断发送图片,服务端循环接收只能收到第一张图片的问题25
package com.cxj.socketimage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class SocketImageClient extends Activity{ private EditText ed_ip = null; private Button bt_ip; private Button start_button; private Button end_button; private static String HOST = ""; private static final int PORT = 9999; private Socket socket = null; Handler handler = new Handler(); int length = 0; byte[] sendBytes = null; OutputStream dos = null; InputStream fis = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ed_ip = (EditText) findViewById(R.id.EditIP); start_button = (Button) findViewById(R.id.start_bt); end_button = (Button) findViewById(R.id.end_bt); bt_ip = (Button) findViewById(R.id.IPbutton); bt_ip.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { HOST = ed_ip.getText().toString(); try { socket = new Socket(HOST, PORT); } catch (IOException ex) { ex.printStackTrace(); ShowDialog("login exception:" + ex.getMessage()); } } }); start_button.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { new Thread(runnable).start(); Toast.makeText(SocketImageClient.this, "start Shot", Toast.LENGTH_SHORT).show(); } }); end_button.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { handler.removeCallbacks(runnable); } }); } public void ShowDialog(String msg) { new AlertDialog.Builder(this).setTitle("notification").setMessage(msg) .setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } Runnable runnable = new Runnable() { public void run() { try { dos = new DataOutputStream(socket.getOutputStream()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); takeScreenShot(end_button).compress( Bitmap.CompressFormat.PNG, 90, baos); fis = new ByteArrayInputStream(baos.toByteArray()); sendBytes = new byte[1024]; while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) { dos.write(sendBytes, 0, length); dos.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (dos != null) dos.close(); if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } handler.postDelayed(runnable, 1000); } }; private static Bitmap takeScreenShot(View arg0) { View view = arg0.getRootView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); return bitmap; } }
这是客户端代码
package com.cxj.SocketImageService; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.InputStream; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.Enumeration; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; public class SocketImageService extends Activity { private static final int PORT = 9999; private Button bt; private TextView tv_ip; static ImageView im; static Bitmap bitmap; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bt = (Button) findViewById(R.id.button1); tv_ip = (TextView) findViewById(R.id.textIP); im=(ImageView)findViewById(R.id.imageView1); tv_ip.setText("本机IP:" + getLocalIpAddress()); new Thread(runnable).start(); bt.setOnClickListener(new Button.OnClickListener() { public void onClick(View arg0) { new Thread() { public void run() { while (true) { try { ServerSocket server = new ServerSocket(PORT); Socket socket = server.accept(); receiveFile(socket); } catch (Exception e) { } } } }.start(); //启动线程运行 } }); } public static void receiveFile(Socket socket) { byte[] inputByte = null; int length = 0; InputStream dis = null; try { try { dis = new DataInputStream(socket.getInputStream()); ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); inputByte=new byte[1024]; while ((length = dis.read(inputByte,0,inputByte.length))>0) { bytestream.write(inputByte, 0, length); } byte[] imageData=bytestream.toByteArray(); bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); im.setImageBitmap(bitmap); bytestream.flush(); bytestream.close(); } finally { if (dis != null) dis.close(); } } catch (Exception e) { } } public String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf .getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e("WifiPreference IpAddress", ex.toString()); } return null; } private Handler handler = new Handler(); private Runnable runnable = new Runnable() { public void run() { im.postInvalidate(); handler.postDelayed(this, 1000);// 间隔1秒 } }; }
这是服务端代码
不知道是不是循环坚挺的问题,还是服务端在读取的时候while没跳出,阻塞了或者是其他原因。初学,请大家多多指教,不吝赐教。
问题补充:我想的是 服务端能够不断的接收到图片并且不断刷新imageview显示图片,现在服务端只能显示出第一张图片。 <br />是不是要用长链接?如果是,怎么用?最好有实例链接什么的,O(∩_∩)O谢谢
问题补充:<div class="quote_title">lzj0470 写道</div><div class="quote_div">你先测试一下,点击一下,发送一次。能不能正常。</div> <br />这个<div class="quote_title">lzj0470 写道</div><div class="quote_div">handler.postDelayed(runnable, 1000); <br />把这个去掉 <br />在所有socket没有用的时候,进行socket.close(); <br /></div> <br />handler.postDelayed(runnable, 1000); 这句话去掉imageview就不刷新了,我现在的状况是服务端只能拿到一张图片,要客户端重新连服务端才能再刷新一张图片。而我是想不关闭socket,socket不断收发,直到有一方主动close
问题补充:<div class="quote_title">lzj0470 写道</div><div class="quote_div"><pre name="code" class="java"> private static Bitmap takeScreenShot(View arg0) {
View view = arg0.getRootView();
view.setDrawingCacheEnabled(false);
//view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
} </pre> <br /> <br />这样呢?</div> <br />还是不行饿,//view.buildDrawingCache();注释了以后点击截图就直接报错了,取消注释和以前没什么2样。2011年11月15日 17:22
9个答案 按时间排序 按投票排序
-
ServerSocket server = new ServerSocket(PORT); 放在循环里面你不是得有好多个Server,试一试放在循环外面看看
2011年11月28日 21:41
-
while (true) { try { ServerSocket server = new ServerSocket(PORT); Socket socket = server.accept(); receiveFile(socket); } catch (Exception e) { } }
猜想应该是上面这句有问题,服务器端在同一个端口建立了多个serverSocket监听,把这句放到循环的外面。2011年11月27日 08:24
-
循环写的不对,就是这句:
# try {
# dis = new DataInputStream(socket.getInputStream());
# ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
# inputByte=new byte[1024];
# while ((length = dis.read(inputByte,0,inputByte.length))>0) {
# bytestream.write(inputByte, 0, length);
# }
# byte[] imageData=bytestream.toByteArray();
# bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
# im.setImageBitmap(bitmap);
# bytestream.flush();
# bytestream.close();
# }
这个while只是读了图,没有再进入读图的状态,而上一级的while循环又是重新建立socket的,客户端要再次重新连接才能发啊,所以这样肯定是不行。
最简单的是改上面这一句,我改成下面这样,不是最优化的,但大概能用。注意:没有数据接收时,会block在read那一句上面。
# try {
# while(true){
# dis = new DataInputStream(socket.getInputStream());
# ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
# inputByte=new byte[1024];
# length =dis.read(inputByte,0,inputByte.length)
# bytestream.write(inputByte, 0, length);
# byte[] imageData=bytestream.toByteArray();
# bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
# im.setImageBitmap(bitmap);
# bytestream.flush();
# bytestream.close();
# }
# }2011年11月21日 15:59
-
private static Bitmap takeScreenShot(View arg0) { View view = arg0.getRootView(); view.setDrawingCacheEnabled(false); //view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); return bitmap; }
这样呢?2011年11月16日 10:48
-
handler.postDelayed(runnable, 1000);
把这个去掉
在所有socket没有用的时候,进行socket.close();2011年11月15日 23:32
相关推荐
在本场景中,"Socket客户端向服务端发送数据"是指一个应用通过Socket接口,建立连接并传递信息到服务端,而服务端则接收这些数据并进行处理。这里我们详细讲解Socket通信的基本原理、步骤以及如何在客户端和服务器...
本文将详细讲解如何使用C#语言通过Socket实现服务端和客户端的发送与接收功能。 首先,我们需要理解Socket的基本概念。Socket是应用层与传输层之间的一个抽象接口,它使得程序员能够方便地使用TCP/IP协议栈。在C#中...
本教程将详细讲解如何利用Java Socket实现基于TCP/IP的服务端和客户端之间的报文发送与接收。 TCP(传输控制协议)是一种面向连接、可靠的传输协议,它确保了数据包的有序和无损传输。IP(互联网协议)则是互联网上...
标题:HP用SOCKET实现(客户端---服务端) 描述:HP用SOCKET实现(客户端---服务端)通信 本文将深入解析如何利用PHP中的Socket编程技术实现客户端与服务端之间的通信,通过分析提供的代码示例,我们将理解其工作原理、...
一个很实用的Socket通讯测试工具,支持TCP、UDP协议,可以作为客户端,也可以做为服务端,支持定时发送,支持发送文件。
在SuperSocket中,服务端通常是一个持续运行的程序,等待客户端连接,处理接收到的数据,并发送响应。客户端则负责建立连接,发送数据,并接收服务端的回复。 **3. 示例中的Net4.0运行库** 这个Demo基于.NET ...
**SuperSocket 概述** ...通过以上步骤,你将能够成功地搭建一个基础的SuperSocket客户端和服务端,实现双向消息传递。随着对SuperSocket的深入理解和实践,你可以构建更复杂、功能丰富的网络应用。
socket编程实现自动应答服务端和客户端 在操作系统Linux中,服务器编程是非常重要的一部分,socket编程是其中的一种常见技术。本文将通过一个实例,演示如何使用socket编程来实现自动应答服务端和客户端。 服务端 ...
使用SuperSocket,你可以快速创建一个Socket服务端,处理来自客户端的连接请求。以下是一些关键步骤: 1. **安装SuperSocket**: 通过NuGet包管理器在你的C#项目中添加SuperSocket库。运行`Install-Package Super...
本示例涉及的主题是“socket服务和客户端测试XML文件接收和发送”,这是一个使用C#语言实现的项目,它允许通过Socket进行XML数据的交换。让我们深入探讨这个主题,了解其背后的原理和实现方法。 首先,Socket是TCP/...
在本文中,我们将深入探讨如何使用C#的Socket编程来实现一个简单的聊天应用程序,其中包含服务器和客户端的交互。Socket编程是网络通信的基础,它允许应用程序通过网络进行数据传输。在C#中,System.Net命名空间下的...
同时,客户端的`SocketClient`简化了发送和接收数据的过程。在实际项目中,开发者可以根据需求扩展这些基础类,实现更复杂的网络通信功能。通过上述的代码示例,你可以了解到如何利用SuperSocket实现服务端与客户端...
3、socket功能类库模块(其他项目也可以引用),socket类库模块功能齐全,只需调用其中方法即可,复用性较强,代码注释详细,实现了心跳,解决了粘包问题,异步发送接收数据,等等,bin目录下右运行日志方便查找程序...
本示例中,我们探讨的是如何利用C#的WinForm来创建一个基于Socket的服务端和客户端,实现两者之间的消息传递,以及在服务器断线后的重连机制。 首先,Socket在C#中是System.Net.Sockets命名空间下的类,它提供了TCP...
网上很多有关socket文件传输的源码都是每次只能发送一个文件,如果想传输多个文件,不但需要多次交互,还需要把每个文件的文件名都输入进去,很不方便,所以进行了一个小扩展:即客户端可以将打算传送的多个文件都先...
4. **消息接收**:服务端通过`accept()`函数接受客户端的连接请求,返回一个新的Socket用于与该客户端通信。然后,服务端可以使用`recv()`或`read()`函数从这个新的Socket读取客户端发送的数据。 5. **数据处理**:...
Java基于socket实现的客户端和服务端通信功能完整实例 在Java中,Socket是实现网络通信的基础,通过Socket可以实现客户端和服务器端之间的通信。本文将详细介绍Java基于Socket实现的客户端和服务端通信功能,包括...
- 实现了`Runnable`接口,重写了`run()`方法,在循环中不断地向服务端发送数据。 - 使用`PrintWriter`配合`OutputStreamWriter`来发送字符串形式的数据。 ##### 3. 数据接收线程 `ReceiveThread` - 同样实现了`...
Socket聊天程序是一个基于C#编程语言实现的网络通信应用,它允许一个服务端与多个客户端进行实时交互。在本文中,我们将深入探讨Socket编程的基本概念、C#中的Socket类、服务器端与客户端的设计以及如何实现多用户...
C# Socket通信(winform) 异步发送消息,服务端客户端通信,可以发送消息和文件并进行接收,代码注释详细 C# Socket通信(winform) 异步发送消息,服务端客户端通信,可以发送消息和文件并进行接收,代码注释详细 ...