///客户端

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. ByteBuffer

    1.堆内:HeapByteBuffer,在java的堆内创建. 缺点:可能引起堆的不断gc 写文件的时候需要先将堆的buffer写进直接buffer里,然后再写入文件 2.堆外:DirectByteB ...

  2. opencv3.0+VS2015+64位win7配置

    首先,我们把所有用到的工具下载下来 VS2015         看这里,http://news.mydrivers.com/1/439/439398.htm,我下载的是专业版. OPENCV3.0 ...

  3. Session服务器配置指南与使用经验

    一.摘要 所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Session共享问题.本文介绍.NET平台下建立Session服务器的几种办法, 并介 ...

  4. NSUserDefaults 可以保存哪些类型

    NSData NSString NSNumber NSDate NSArray NSDictionary *如果你想保存其他类型,如UIImage,你应该进行编码(即archive),或者将它转换为N ...

  5. MySQL主从配置问题整理

    前段时间线下数据库需要搭建主从库.由于不想备份数据库,打算直接克隆数据库虚拟机到新的一台,然后配置主从同步.以前没这么干过,所以也没有遇到过什么问题,今天把遇到的问题整理了一下. 192.168.3. ...

  6. SQL Server中的SQL语句优化与效率问题

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  7. mysql -B 恢复与不加

    -B 跟--database 意义一样 在默认不指定库时候 连续名称,只有第一个名称为库名,后面的都为表名 而使用 -B 或者 --database 之后 所有的名 都是库名 1 导出单个库时候加了- ...

  8. 解决:打开OleView报错 dllregisterserver in iviewers failed

    用管理员权限运行OleView.exe即可(Visual Studio Tools\VS20XX开发人员命令提示 -> 用管理员权限运行 -> 输入OleView) http://stac ...

  9. iOS - (TableView中利用系统的 cell 设置 cell.textlabel 位置和大小)

    今天工作稍微的遇到了一点小小的难题,需求效果中 TableView cell 中的 Label 字体大小比原先系统中的要大些且 Label 位置不是在前面,而是在中间往后,对于这个问题我第一时间也是想 ...

  10. 深入理解JAVA I/O系列六:Linux中的IO模型

    IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...