socket的简单通信
///客户端
package com.ch.day11_myclient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.Menu;
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 {
private TextView allmessage;
private EditText say;
private Button send;
private Socket client;
BufferedReader br;
PrintWriter pw;
String sayData;
Handler h = new Handler(){
public void handleMessage(android.os.Message msg) {
String str = (String)msg.obj;
allmessage.setText(allmessage.getText().toString()+"\t\n"+str);
// allmessage.append(str);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
public void init(){
allmessage = (TextView) findViewById(R.id.allmessage);
say = (EditText) findViewById(R.id.say);
send = (Button) findViewById(R.id.send);
//建立和服务器的连接
try {
client = new Socket("169.254.109.73", 8888);//向169.254.109.73服务器的8888端口发送请求
//获得服务器端的信息,先创建服务器的输入流
br = new BufferedReader(new InputStreamReader(client.getInputStream()));
//向服务器发送消息,先创建输出流
pw = new PrintWriter(client.getOutputStream());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//启动一个线程,随时接收服务器的信息
new Thread(){
public void run() {
try {
while(true){
String str = br.readLine();//读取当前服务器的一句话,读到为止,读不到不会继续向下走
Log.i("TAG", str);
//把str显示到allmessage
h.sendMessage(h.obtainMessage(0x123, str));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
//点击发送,发送消息
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//得到发送的信息
sayData = say.getText().toString();
new Thread(){
public void run() {
Log.i("TAG", "11111111::::"+sayData);
pw.println(sayData);
pw.flush();//及时刷新,推送过去
};
}.start();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
///服务端
package com.ch;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final ArrayList<Socket> ss = new ArrayList<Socket>();
try {
//启动服务器
ServerSocket server = new ServerSocket(8888);
while(true){
System.out.println("等待接收一个新的客户端的请求..............");
//等待接收一个客户端,接收到为止,代码才会继续向下执行
final Socket client = server.accept();
System.out.println("接收到了一个新的客户端的请求,ip:"+client.getInetAddress().toString());
ss.add(client);//把当前接收到的客户端,收集起来
//启动一个线程,接收当前客户端的信息,转发给其他客户端
new Thread(){
public void run() {
try {
//获得客户端的信息,先创建客户端的输入流
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){//有多条信息,需要循环读取
String data = br.readLine();//读取当前客户的信息
//把当前信息转发给,其他客户端,自己除外
//遍历集合获得所有客户端
for(Socket sk:ss){
if(sk != client){//自己除外
//创建一个兄弟客户端的输出流
PrintWriter pw = new PrintWriter(sk.getOutputStream());
pw.println(client.getInetAddress().toString()+"--say:"+data);
pw.flush();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
// PrintWriter pw = new PrintWriter(client.getOutputStream());
// while(true){
// String str = br.readLine();//读取当前客户端的一句话,没有读到,此行代码不行执行完
// System.out.println(client.getInetAddress().toString()+"say::"+str);
// //向客户端发送消息,先创建输出流
// pw.println(str+",是吗?");
// pw.flush();//及时刷新,推送过去
//
// }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
socket的简单通信的更多相关文章
- TCP和UDP并实现socket的简单通信
http://www.cnblogs.com/IPrograming/archive/2012/10/15/CSharp_Socket_4.html http://www.cnblogs.com/do ...
- 基于TCP 协议的socket 简单通信
DNS 服务器:域名解析 socket 套接字 : socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...
- 【转】Qt Socket简单通信
最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...
- socket上http协议应用(使用socket进行http通信的例子,准备好报头以后,简单read/write就可以了)
前几天看socket本有点晕, 好不容易弄明白了,才发现公司服务器用的是http的. 找了好久也没发现linux下直接用http的api, 不过今日偶然发现了使用socket进行http通信的例子, ...
- socket.io简单说明及在线抽奖demo
socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...
- 运用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...
- java socket实现全双工通信
java socket实现全双工通信 单工.半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工. 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方 ...
- Eclipse搭建服务器,实现与Android的简单通信
---恢复内容开始--- 目标:实现客户端(Android App)与服务器(PC)的简单通信 相关准备:eclipse_mars.tomcat8.Android Studio 实现: 1.java环 ...
- Spring+Netty4实现的简单通信框架
参考:http://cpjsjxy.iteye.com/blog/1587601 Spring+Netty4实现的简单通信框架,支持Socket.HTTP.WebSocket_Text.WebSock ...
随机推荐
- Asset Store
Asset Store 是用来供Unity开发者将自己的插件拿出来供大家有偿使用的一个平台. 报错信息: failed to import package with error cannot impo ...
- sell -- 解码16进制unicode
1. //System.out.println("decodeUnicode:" + decodeUnicode("0049"));//I public sta ...
- Mysql---DML 语句与DCL语句
DML 语句: DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查(select),是开发人员日常使用最频繁的操作.下面将依次 ...
- Java ConcurrentHashMap
通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占, ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术. ...
- curl命令常见用法汇总 good
curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面. curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服 ...
- Make Rules
target: components ls TAB rule main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2. ...
- java 笔记(2) —— 内部类的作用
一.内部类简介 个人觉得内部类没多少研究价值,GUI中的事件响应算是非常典型的应用了. Java内部类其实在J2EE编程中使用较少,不过在窗口应用编程中特别常见,主要用来事件的处理.其实,做非GUI编 ...
- 学习CSS3BUTTON(二)
今天,继续学习其源代码: button { margin-left: 0; margin-right: 0; *padding: 5px 5px 3px 5px; } /*margin-left:设定 ...
- centos 6.4下设置输入法
最近安装了centos,设置输入法步骤如下: 1)确定安装了Chinese support: : yum install "@Chinese Support" 2)输入法设置 在界 ...
- 前端构建工具gulpjs
gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...