///客户端

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. linux 文件权限 初级

    sudo lsattr /etc/sudoers  查看属性 sudo vi index.html 以root权限编辑文件

  2. mina学习

    长连接表示一旦建立了链接,就可以长时间的保持双方的通讯,例如: socket链接,推送平台. 短链接表示建立链接,完成数据的交换之后,就断开链接,例如: http链接. mina 框架是对socket ...

  3. C#高级编程 反射 代码示例

    反射 反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等. 还可以获得每 ...

  4. Fluentd安装——通过rpm方式

    0. td-agent是何物 为了灵活性,fluentd用Ruby写的,其中一些性能敏感的部件使用c写的.普通的用户直接安装和使用Ruby进程可能有困难,这样就把它封装成Fluentd的稳定版本——t ...

  5. MSDN相关下载地址

    Windows Server 2016官网下载:https://msdn.microsoft.com/zh-cn/subscriptions/downloads/default.aspx#search ...

  6. category分类

    /* 使用继承关系来扩充一个类,有一个弊病,高耦合性 category(分类,类别) 能够帮我们扩充一个类的功能 */ - (void)superJump { //    [self eat]; [s ...

  7. linux 命令进阶

    1. ls –i -i, --inode            显示每个文件的inode 号 查看inode 可以用于 同一个classloader加载同名class时,是以先加载到的class为准, ...

  8. Java基础之读文件——使用缓冲读取器读取文件(ReaderInputFromFile)

    控制台程序,本例读取Java基础之写文件部分(WriterOutputToFile)写入的Saying.txt. import java.io.*; import java.nio.file.*; i ...

  9. PAT 解题报告 1051. Pop Sequence (25)

    1051. Pop Sequence (25) Given a stack which can keep M numbers at most. Push N numbers in the order ...

  10. 01分数规划zoj2676(最优比例,最小割集+二分)

    ZOJ Problem Set - 2676         Network Wars Time Limit: 5 Seconds      Memory Limit: 32768 KB      S ...