zoukankan      html  css  js  c++  java
  • Android基于socket的群聊程序

    在网上看了好多,但是感觉不是太简单就是只能单独聊,所以就自己写了个可以群聊的,直接上代码了

    一、服务器端

    这里用的MyEclipse作为服务器端

    MyServerScoket.java

    package com.scme.server;
    
    
    public class MyServerScoket {
    
        public static void main(String[] args) {
            new ServerListener().start();
        }
    }

    ServerListener.java

    package com.scme.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import javax.swing.JOptionPane;
    
    public class ServerListener extends Thread {
    
        @Override
        public void run() {
            // 1-65535
            try {
                // 端口
                ServerSocket serverScoket = new ServerSocket(12345);
                while (true) {
                    // 阻塞当前线程
                    Socket socket = serverScoket.accept();
                    // 建立连接,控制台打印
                    System.out.println("有客户端连接到了本机的12345端口");
                    // 弹出窗口提示
                    JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345端口");
                    //将socket传递新的线程
                    ChatSocket cs = new ChatSocket(socket);
                    cs.start();
                    ChatManger.getChatManger().add(cs);
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    ChatSocket.java

    package com.scme.server;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    public class ChatSocket extends Thread {
        
        Socket socket;
    
        public ChatSocket(Socket s){
            this.socket = s;
        }
        
        public void out(String out){
            try {
                socket.getOutputStream().write((out+"
    ").getBytes("UTF-8"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
        
        @Override
        public void run() {
            out("你已经连接到本服务器了");
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
                String line = null;
                while ((line = br.readLine()) != null) {
                    ChatManger.getChatManger().publish(this, line);
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            
        }
    }

    ChatManger.java

    package com.scme.server;
    
    import java.util.Vector;
    
    public class ChatManger {
    
        //单例化
        private ChatManger(){}
        private static final ChatManger cm = new ChatManger();
        public static ChatManger getChatManger(){
            return cm;
        }
        
        Vector<ChatSocket> vector = new Vector<ChatSocket>();
        
        public void add(ChatSocket cs){
            vector.add(cs);
        }
        
        public void publish(ChatSocket cs,String out){
            for (int i = 0; i < vector.size(); i++) {
                ChatSocket csChatSocket = vector.get(i);
                if (!cs.equals(csChatSocket)) {
                    csChatSocket.out(out);
                }
            }
        }
    }


     二、客户端

    布局文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <EditText
                android:id="@+id/ip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.6"
                android:hint="输入服务器的IP地址"
                android:text="10.0.2.2" >
    
            </EditText>
    
            <Button
                android:id="@+id/connect"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="0.4"
                android:text="连接" />
    
        </LinearLayout>
    
        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.86" >
    
            <TextView
                android:id="@+id/text"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="Ready..." />
        </ScrollView>
    
        <EditText
            android:id="@+id/edit"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="在这里输入内容" />
    
        <Button
            android:id="@+id/send"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="发送" />
    
    </LinearLayout>


    Main.java

    package com.scme.aserversocket;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    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.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity implements OnClickListener {
        
        private EditText ip,edit;
        private TextView text;
        
        private void init() {
            ip = (EditText) findViewById(R.id.ip);
            edit = (EditText) findViewById(R.id.edit);
            text = (TextView) findViewById(R.id.text);
            findViewById(R.id.connect).setOnClickListener(this);
            findViewById(R.id.send).setOnClickListener(this);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }
        
        Socket socket = null;
        BufferedWriter writer = null;
        BufferedReader reader = null;
        
        /**
         * 连接
         */
        public void connect(){
                AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>(){
                    
                    @Override
                    protected Void doInBackground(Void... params) {
                        try {
                            socket = new Socket(ip.getText().toString(), 12345);
                            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            publishProgress("@success");
                        } catch (Exception e) {
                            Toast.makeText(MainActivity.this, "无法建立连接", 1000).show();
                            e.printStackTrace();
                        }
                        try {
                            String line;
                            while ((line = reader.readLine())!=null) {
                                publishProgress(line);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        return null;
                    }
    
                    @Override
                    protected void onProgressUpdate(String... values) {
                        if (values[0].equals("@success")) {
                            Toast.makeText(MainActivity.this, "建立连接成功", 1000).show();
                        }
                        text.append("对方说:"+values[0]+"
    ");
                        super.onProgressUpdate(values);
                    }
    
                };
                read.execute();
        }
        
        /**
         * 发送
         */
        public void send(){
            try {
                text.append("我说:"+edit.getText().toString()+"
    ");
                writer.write(edit.getText().toString()+"
    ");
                writer.flush();
                edit.setText("");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            //连接
            case R.id.connect:
                connect();
                break;
            //发送
            case R.id.send:
                send();
                break;
            }
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }


    客户端任意开。。。

    还有最重要的,别忘了在主配置文件里加入网络权限啊。。。

  • 相关阅读:
    mysql导出表的数据,在导入
    oracle数据迁移到mysql
    mybatis-使用generator反向数据库表并生成dao和mapping映射
    SQLserver单表数据导入导出
    java内省
    java反射
    springmvc文件上传
    Dubbo学习笔记8:Dubbo的集群容错与负载均衡策略
    Dubbo学习笔记7:Dubbo增强SPI与SPI中扩展点自动包装的实现原理
    Dubbo学习笔记6:Dubbo整体框架分析
  • 原文地址:https://www.cnblogs.com/chengzhengfu/p/4581797.html
Copyright © 2011-2022 走看看