我有c套接字服务器和android客户端。服务器在一段时间间隔后不断向客户端发送数据。问题是如何在android客户端上实现这个获取数据
socket = new Socket("xxx.xxx.xxx.x", xxxx); // I connect
.... socket.getInputStream(); // Get first input stream
如何让它连续接收数据?我尝试了这样的东西,而(true){...socket.getInputStream(); Thread.sleep(...);}没有帮助
您可以使用此Webstart应用程序并通过提供您的ip地址和端口来创建本地服务器,并且可以在下面的代码中使用相同的ip地址和端口作为客户端...!您可以发送和接收msgs。是的,在AndroidManifest中提供INTERNET权限。
MainActivity.java
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
Button btnStart, btnSend, disconnect;
TextView textStatus;
EditText message, ipAddress, port;
ImageView image;
NetworkTask networktask;
String ip, prt;
Socket nsocket;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button)findViewById(R.id.btnStart);
disconnect = (Button)findViewById(R.id.bDisconnect);
btnSend = (Button)findViewById(R.id.btnSend);
textStatus = (TextView)findViewById(R.id.textStatus);
image = (ImageView)findViewById(R.id.ivBit);
message = (EditText) findViewById(R.id.message);
ipAddress = (EditText)findViewById(R.id.ipAddress);
port = (EditText)findViewById(R.id.port);
btnStart.setOnClickListener(btnStartListener);
btnSend.setOnClickListener(btnSendListener);
disconnect.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
try {
nsocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
// networktask = new NetworkTask(ip, prt); //Create initial instance so SendDataToNetwork doesn't throw an error.
}
private OnClickListener btnStartListener = new OnClickListener() {
public void onClick(View v){
disconnect.setVisibility(View.VISIBLE);
btnStart.setVisibility(View.GONE);
ipAddress.setEnabled(false);
port.setEnabled(false);
ip = ipAddress.getText().toString();
prt = port.getText().toString();
System.out.println("IPADDRESS :::::::" + ip);
System.out.println("PORT :::::::" + prt);
networktask = new NetworkTask(ip, prt); //New instance of NetworkTask
networktask.execute();
}
};
private OnClickListener btnSendListener = new OnClickListener() {
public void onClick(View v){
textStatus.setText("Sending Message to AsyncTask.");
networktask.SendDataToNetwork(message.getText().toString() + "\n");
}
};
public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
//Network Socket
InputStream nis; //Network Input Stream
OutputStream nos; //Network Output Stream
String data = ""; //Data Received
String ip, prt;
public NetworkTask(String ip, String prt) {
// TODO Auto-generated constructor stub
this.ip = ip;
this.prt = prt;
}
@Override
protected void onPreExecute() {
Log.i("AsyncTask", "onPreExecute");
}
@Override
protected Boolean doInBackground(Void... params) { //This runs on a different thread
boolean result = false;
try {
Log.i("AsyncTask", "doInBackground: Creating socket");
SocketAddress sockaddr = new InetSocketAddress(ip, Integer.parseInt(prt)); //192.168.2.102 118.139.161.101
nsocket = new Socket();
nsocket.connect(sockaddr, 500); //10 second connection timeout
if (nsocket.isConnected()) {
nis = nsocket.getInputStream();
nos = nsocket.getOutputStream();
Log.i("AsyncTask", "doInBackground: Socket created, streams assigned");
Log.i("AsyncTask", "doInBackground: Waiting for inital data...");
byte[] buffer = new byte[4096];
int read = nis.read(buffer, 0, 4096); //This is blocking
while(read != -1){
byte[] tempdata = new byte[read];
System.arraycopy(buffer, 0, tempdata, 0, read);
publishProgress(tempdata);
Log.i("AsyncTask", "doInBackground: Got some data");
read = nis.read(buffer, 0, 4096); //This is blocking
}
}
} catch (IOException e) {
e.printStackTrace();
Log.i("AsyncTask", "doInBackground: IOException");
result = true;
} catch (Exception e) {
e.printStackTrace();
Log.i("AsyncTask", "doInBackground: Exception");
result = true;
} finally {
try {
nis.close();
nos.close();
nsocket.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Log.i("AsyncTask", "doInBackground: Finished");
}
return result;
}
public void SendDataToNetwork(String cmd) { //You run this from the main thread.
try {
if (nsocket.isConnected()) {
Log.i("AsyncTask", "SendDataToNetwork: Writing received message to socket");
nos.write(cmd.getBytes());
} else {
Log.i("AsyncTask", "SendDataToNetwork: Cannot send message. Socket is closed");
}
} catch (Exception e) {
Log.i("AsyncTask", "SendDataToNetwork: Message send failed. Caught an exception");
}
}
@Override
protected void onProgressUpdate(byte[]... values) {
if (values.length > 0) {
Log.i("AsyncTask", "onProgressUpdate: " + values[0].length + " bytes received.");
data += new String(values[0]);
textStatus.setText(data);
System.out.println("DATA RECEIVED..........." + (data));
}
}
@Override
protected void onCancelled() {
Log.i("AsyncTask", "Cancelled.");
disconnect.setVisibility(View.VISIBLE);
btnStart.setVisibility(View.GONE);
ipAddress.setEnabled(true);
port.setEnabled(true);
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
Log.i("AsyncTask", "onPostExecute: Completed with an Error.");
textStatus.setText("There was a connection error.");
} else {
Log.i("AsyncTask", "onPostExecute: Completed.");
}
disconnect.setVisibility(View.GONE);
btnStart.setVisibility(View.VISIBLE);
ipAddress.setEnabled(true);
port.setEnabled(true);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
networktask.cancel(true); //In case the task is currently running
}
}
主要的xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/ipAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:digits="0123456789."
android:inputType="number" />
<EditText
android:id="@+id/port"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:digits="0123456789."
android:inputType="number" />
<Button
android:id="@+id/bDisconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="Disconnect" />
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start AsyncTask" >
</Button>
<EditText
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textMultiLine" >
</EditText>
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Message" >
</Button>
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/textStatus"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Status Goes Here"
android:textSize="24sp" />
<ImageView
android:id="@+id/ivBit"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</LinearLayout>
请注意,您只需打开输入流一次。然后,如果对输入流执行read()
操作,它将阻塞(当然,如果使用阻塞读取(阻塞与非阻塞读取))。
您可以在此处找到有关java套接字编程的信息:链接
您可以在此处找到在Android平台上丢失的套接字编程示例:链接
例如:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = "";
while (true) {
line = br.readLine(); // at this line, execution will stop until data is received
System.out.println("The read line is: " + line);
}
br.close();
问题内容: 我尝试使用以下代码从服务器到客户端发送文件和目录列表。服务器正在从客户端接收消息,但我不知道服务器是否没有发送回结果或客户端是否不接受结果。 服务器端: 问题答案: 据我所见,您在客户端上做的同时在服务器上做。从服务器发送的字符串中没有行尾字符,因此客户端将永远无法完成。执行outqw.println()或添加到要发送的内容的末尾。话虽这么说,很难用一堆注释掉的东西来浏览未格式化的代码
本文向大家介绍python服务器与android客户端socket通信实例,包括了python服务器与android客户端socket通信实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python服务器与android客户端socket通信的方法。分享给大家供大家参考。具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: 下面是Android代码: 安卓代
我正在尝试创建TLS v1。2.服务器和android客户端之间的通信。我建立了TLS v1。0连接有任何问题,但我无法获取v1。2.这是服务器代码: 虽然这是客户端代码: 客户端代码,写在java客户端运行在JRE7在我的PC上,完美的作品,我看到与getProtocol(服务器端)TLSv1.2正确的密码,由tlsv1.2支持。在Android上相同的代码使tlsv1.0连接!我真的不明白。在
本文向大家介绍php socket客户端及服务器端应用实例,包括了php socket客户端及服务器端应用实例的使用技巧和注意事项,需要的朋友参考一下 经常有朋友会对php的socket应用充满疑惑,本文就以实例代码作一讲解,希望能对初学php的朋友起到一点帮助作用 具体代码如下: 1.服务器端代码: 2.客户端代码: 注意事项:服务器端请用CLI模式运行,cgi模式会超时,这是新手常喜欢犯的错误
我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se
我正在尝试在JMeter中记录任何客户端-服务器活动作为学习的开始。我是从公司网络这样做的,因此必须通过代理。以下是我记录的步骤。 > 我在JMeter文档中读到,为了通过代理进行记录,我必须通过提供适当的代理从命令中调用。我用下面的代码来调用JMeter。 jmeter -H "取自互联网设置的代理地址"-P "8080" -u "域*用户名*" -a "密码"。 用这个JMeter调用fine