///客户端

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的简单通信的更多相关文章

  1. TCP和UDP并实现socket的简单通信

    http://www.cnblogs.com/IPrograming/archive/2012/10/15/CSharp_Socket_4.html http://www.cnblogs.com/do ...

  2. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

  3. 【转】Qt Socket简单通信

    最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...

  4. socket上http协议应用(使用socket进行http通信的例子,准备好报头以后,简单read/write就可以了)

    前几天看socket本有点晕, 好不容易弄明白了,才发现公司服务器用的是http的. 找了好久也没发现linux下直接用http的api, 不过今日偶然发现了使用socket进行http通信的例子, ...

  5. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  6. 运用socket实现简单的服务器客户端交互

    Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...

  7. java socket实现全双工通信

    java socket实现全双工通信 单工.半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工. 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方 ...

  8. Eclipse搭建服务器,实现与Android的简单通信

    ---恢复内容开始--- 目标:实现客户端(Android App)与服务器(PC)的简单通信 相关准备:eclipse_mars.tomcat8.Android Studio 实现: 1.java环 ...

  9. Spring+Netty4实现的简单通信框架

    参考:http://cpjsjxy.iteye.com/blog/1587601 Spring+Netty4实现的简单通信框架,支持Socket.HTTP.WebSocket_Text.WebSock ...

随机推荐

  1. JavaWeb学习笔记(一)Mac 下配置Tomcat环境

     最近,想鼓捣与服务器端的交互,只能自己搭建环境了. 上个周一鼓捣了一点,周五再鼓捣,发现忘得已经差不多了.好记性不如烂笔头,还是记录下来比较好. 首先,去Tomcat的官网,下载Mac版的Tomca ...

  2. JS-007-富文本域操作

    在日常 web 编写过程中,富文本域几乎成为了一个网站不可页面元素,同时,其也有着各种各样的实现方式,网络上也存在着各种各样的集成插件可供引用.此文以 js 获取.修改 163 邮箱写邮件时的邮件内容 ...

  3. 在RHEL5.2 64bit下编译安装log4cxx错误

    apache-log4cxx.0.10.0 依赖于apache-apr和apache-apr-utils两个包 先安装他们俩,然后编译log4cxx,发现make失败,错误如下 ronized.o . ...

  4. LeetCode Majority Element I && II

    原题链接在这里:Majority Element I,Majority Element II 对于Majority Element I 来说,有多重解法. Method 1:最容易想到的就是用Hash ...

  5. day04-java-循环结构(while、do-while、for)

    循环结构(while.do-while.for) 任何复杂的程序逻辑都可以通过三种结构来实现:1)顺序结构:从上往下逐行执行,每句必走2)分支结构:有条件的执行某语句一次,并非每句必走3)循环结构:有 ...

  6. js的运算

    1.表达式 表达式是EMCAscript中的一个“短语”,解释器会通过计算把它转换成一个值.最简单的表达式是字面量或者变量名. 2.前置递增(++box)和后置递增(box++)的区别 看下面一段代码 ...

  7. linux 安装apahce的configure: error: APR not found. Please read the documentation解决办法

    1.下载所需软件包: 下载apr并配置 wget http://apache.freelamp.com/apr/apr-1.4.2.tar.gz 下载apr ./configure –prefix=/ ...

  8. 30天,APP创业从0到1【7.25上海站】

    活动概况 时间:2015年7月25日13:30-16:30 地点:太库•上海孵化器(张江金科路2889号长泰广场c座12楼) 主办:APICloud.诸葛.圣诺资讯 联合主办:微链.太库•上海孵化器 ...

  9. MongoDB固定集合

    固定集合 MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头 ...

  10. jQuery中append()与appendTo()方法区别

    1. append(content)方法 方法作用:向每个匹配的元素内部追加内容. 参数介绍:content (<Content>): 要追加到目标中的内容. 用法示例: HTML代码为& ...