聊天室

xiaoxiao2021-02-27  209

电脑端聊天室小程序,实现方法及部分代码! 希望对大家有所帮助

ChatManager.java

import java.util.Vector; /** * 1、把所有的东西都管理起来 add 2、把一个的人的东西 发给其他所有人 * @author Administrator */ public class ChatManager { // Vector 和 List 都是集合 // Vector线程安全 list线程不安全 速度快 Vector<ChatSocket> list = new Vector<ChatSocket>(); private ChatManager() { }; private static ChatManager manager = new ChatManager(); public static ChatManager getInstance() { return manager; } public void add(ChatSocket chatSocket) { list.add(chatSocket); } /** * 1、接收一个参数 :发送数据的人 * 2、因为在管理器重有一个vector集合 那么就可以把集合中的每一个char线程获取得到 发送数据 * @param socket */ public void publishData(ChatSocket cs, String data) { for (int i = 0; i < list.size(); i++) { if(cs != list.get(i)){ list.get(i).sendData(data); } } } }

ChatSocket.java

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class ChatSocket extends Thread{ Socket socket; public ChatSocket(Socket socket) { super(); this.socket = socket; } @Override public void run() { readData(); super.run(); } private void readData() { try { InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); //可以按行读取 BufferedReader br = new BufferedReader(isr); String line = ""; while((line = br.readLine()) != null){ //读到客户端数据后 转发给其他客户端 ChatManager.getInstance().publishData(this, line); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void sendData(String data){ try { OutputStream os = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8"); BufferedWriter bw = new BufferedWriter(osw); bw.write(data + "\r\n"); bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

MyServerSocket.java

public class MyServerSocket { public static void main(String[] args) { new SocketListner().start(); System.out.println("服务器已经开启"); } }

# SocketListner.java

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class SocketListner extends Thread{ @Override public void run() { try { ServerSocket ss = new ServerSocket(10101); while(true){ Socket socket = ss.accept(); System.out.println("客户端连接成功"); ChatSocket chatSocket = new ChatSocket(socket); chatSocket.start(); //把聊天线程的对象 放到一个管理器的集合中 ChatManager.getInstance().add(chatSocket); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } super.run(); } }

手机端聊天室,在电脑端的基础上才可以运行!

activity_main.xml

<Button android:id="@+id/btn_conn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="链接服务器" /> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/et" android:`这里写代码片`layout_below="@+id/btn_conn" android:text="聊天记录" /> <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入信息" android:layout_above="@+id/btn_send" /> <Button android:id="@+id/btn_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送" android:layout_alignParentBottom="true" />

MainActivity.java

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { TextView tv; EditText et; Button btn_send, btn_conn; BufferedReader br; BufferedWriter bw; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); et = (EditText) findViewById(R.id.et); btn_send = (Button) findViewById(R.id.btn_send); btn_conn = (Button) findViewById(R.id.btn_conn); btn_conn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { connectServer(); } }); btn_send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sendData(); } }); } protected void sendData() { if(bw != null){ try { tv.append("\r\n我说:" + et.getText().toString()); bw.write(et.getText().toString() + "\r\n"); bw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 1、链接服务器数据网络请求 * 1、使用线程+handler 或者 异步任务 * 2、添加网络权限 */ protected void connectServer() { new AsyncTask<String, String, String>() { @Override protected String doInBackground(String... params) { //使用Socket链接服务器的过程 try { Socket socket = new Socket("169.254.122.215", 10101); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line = ""; while((line = br.readLine()) != null){ //把line数据显示在TextView上 publishProgress(line); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); } @Override protected void onProgressUpdate(String... values) { tv.append("\r\n别人说:" + values[0]); super.onProgressUpdate(values); } }.execute(); } }

转载请注明原文地址: https://www.6miu.com/read-15533.html

最新回复(0)