服务器端 ChatServer.java
很简单的一个普通java项目
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Iterator;
public class ChatServer {
private HashSet<Socket>clients=new HashSet<Socket>();//用于存储客户端用户列表
public ChatServer()
{
try
{
ServerSocket ss=new ServerSocket(6666);
while(true)
{
Socket socket=ss.accept();
clients.add(socket);
System.out.println("有一个用户进入聊天室...");
new ServerThread(socket,clients).start();
}
}catch(Exception ex)
{
ex.printStackTrace();
}
}
public static void main(String[]args)
{
new ChatServer();
System.out.println("服务器已启动...");
}
class ServerThread extends Thread
{
private Socket s;
private HashSet clients;
public ServerThread(Socket s,HashSet clients)
{
this.s=s;
this.clients=clients;
}
public void run()
{
try
{
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true)
{
Iterator iter=clients.iterator();
while(iter.hasNext())
{
String temp=br.readLine();
Socket tempSocket=(Socket)iter.next();
PrintWriter pt=new PrintWriter(tempSocket.getOutputStream());
pt.println(new String(("from server:"+temp).getBytes(),"utf-8"));
pt.flush();
// 尝试使用以下几种写法
// OutputStreamWriter osw=new OutputStreamWriter(s.getOutputStream());
// osw.write(br.readLine());
// osw.flush();
// OutputStream os=s.getOutputStream();
// os.write(br.readLine().getBytes());
// os.flush();
// BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
// bw.write(br.readLine());
// bw.flush();
// BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
// bos.write(br.readLine().getBytes());
// bos.flush();
// DataOutputStream dos=new DataOutputStream(s.getOutputStream());
// dos.write(br.readLine().getBytes());
// dos.flush();
}
}
}catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}
客户端程序是一个简单到不能再简单的安卓应用
贴上main.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" >
<TextView
android:id="@+id/tv_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
ChatClientActivity.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class ChatClientActivity extends Activity {
/** Called when the activity is first created. */
private TextView tv_content;
private Button btn_send;
private EditText et_content;
Socket s ;
String strContent="";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_content = (TextView) findViewById(R.id.tv_content);
btn_send = (Button) findViewById(R.id.button1);
et_content = (EditText) findViewById(R.id.editText1);
try
{
s= new Socket("192.168.1.101", 6666);
}catch(Exception ex)
{
ex.printStackTrace();
}
btn_send.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
try {
String content = et_content.getText().toString();
PrintWriter pw=new PrintWriter(s.getOutputStream());
pw.println(content);
pw.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
);
new Thread()
{
public void run()
{
while(true)
{
try {
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
strContent+=br.readLine()+"\n";
sendMsg(1,getContentHandler);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
public void sendMsg(int flag,Handler handler)
{
Message msg=new Message();
msg.what=flag;
handler.sendMessage(msg);
}
private final Handler getContentHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case 1:
tv_content.setText(strContent);
break;
}
super.handleMessage(msg);
}
};
}
最后,不要忘记在AndroidManifest.xml中加入 <uses-permission android:name="android.permission.INTERNET" />
<?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" >
<TextView
android:id="@+id/tv_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>