1. 程式人生 > >java與c#使用Socket實現區域網聊天

java與c#使用Socket實現區域網聊天

先執行一個java寫的區域網聊天,效果圖如下


後使用c#圖形修改如下:


c#程式碼:

servlet服務端

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace Server
{
	public partial class MainForm : Form
	{
		private TcpListener listener;
		
		private Dictionary<String,TcpClient> socketList;
		private bool tag = true;
		private StringBuilder charList;
		
		public MainForm()
		{
			InitializeComponent();
			Control.CheckForIllegalCrossThreadCalls = false;
		}
		
		void Bu_StartClick(object sender, EventArgs e)
		{
			cb_chatList.Items.Clear();
			selectChat.Text="";
			int port = 8888;
			//建立服務端,並且啟動
			try{
				listener = new TcpListener(IPAddress.Parse(ipAddress()),port);
				listener.Start();	
				
				bu_Start.Enabled = false;
				bu_stop.Enabled = true;
			}catch(Exception ex)
			{
				MessageBox.Show("伺服器啟動失敗, 原因:"+ex.Message);
				bu_Start.Enabled = true;
				bu_stop.Enabled = false;
				return;
			}
			selectChat.Text = "伺服器啟動成功,訪問IP:"+ipAddress()+"  埠號:"+port;
			
			//記錄住連線的客戶端
			socketList = new Dictionary<String,TcpClient>();
			charList = new StringBuilder();
			
			//使用多執行緒,用於多個客戶端接入
			Thread th = new Thread(new ThreadStart(executeTask));
			th.Start();
		}
		public void executeTask()
		{
			while(tag)
			{
				//等待使用者連線
				TcpClient client = null;
				try{
					client = listener.AcceptTcpClient();
				}catch(Exception)
				{
				}
				Thread th = new Thread(executeRead);
				th.Start((Object)client);
			}
		}
		public void executeRead(Object pamars)
		{
			//永久監聽讀取客戶端
			TcpClient client = pamars as TcpClient;
			while(tag)
			{
				NetworkStream ns = client.GetStream();
				StreamReader sr = new StreamReader(ns);
				String msg = String.Empty;
				String people = String.Empty;
				try {
					msg = sr.ReadLine();
					if(msg.IndexOf("<clientName>")!=-1)
					{
						msg = Regex.Split(msg,"=")[1];
				        cb_chatList.Items.Add(msg);       		
			        	charList.Append(msg).Append("<@>");
						socketList.Add(msg,client);
						msg = "<br>歡迎【"+msg+"】光臨<br>";
					}
					selectChat.AppendText(msg.Replace("<br>","\r\n"));
					sendMsg(String.Empty,msg);
				} catch (Exception) {
					//MessageBox.Show(ex.Message.ToString());
					break;
				}
			}
		}
		public void sendMsg(String target,String msg)
		{
			if(String.Empty!=target)
			{
				TcpClient client = socketList[target];
				StreamWriter sw = new StreamWriter(client.GetStream());
				sw.WriteLine(msg);
				sw.Flush();	
			}else{
				Dictionary<String,TcpClient>.KeyCollection keyColl = socketList.Keys;
				foreach (String name in keyColl) 
				{
					StreamWriter sw = new StreamWriter(socketList[name].GetStream());
					sw.WriteLine(msg+"<@
[email protected]
>"+charList.ToString()); sw.Flush(); } } } /*根據計算名獲取IP地址*/ public String ipAddress() { IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName()); return address[2].ToString(); } void ServerFromFormClosing(object sender, FormClosingEventArgs e) { e.Cancel = false; if(tag) tag = false; if(listener!=null) listener.Stop(); } void Bu_stopClick(object sender, EventArgs e) { bu_Start.Enabled = true; bu_stop.Enabled = false; if(tag) tag = false; if(listener!=null) listener.Stop(); } } }
Client客戶端
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace Client
{
	public partial class MainForm : Form
	{
		private System.Windows.Forms.Timer closeWindowTimer;
		
		private StreamReader sr;
		private StreamWriter sw;
		private TcpClient tc;
		private ClientLong cl;
		private bool tag = true;
			
		public MainForm(TcpClient tcp,ClientLong clo)
		{
			cl = clo;
			tc = tcp;
			InitializeComponent();
			Control.CheckForIllegalCrossThreadCalls = false;
			bu_simple.Hide();
		}
		void ClientFromLoad(object sender, EventArgs e)
		{
			PiayCheckedChanged();
		}
		
	   /*事件方法*/
       public  void PiayCheckedChanged()
       {
            closeWindowTimer = new System.Windows.Forms.Timer();
            closeWindowTimer.Interval = 1000;
            closeWindowTimer.Tick += new EventHandler(theout);
            closeWindowTimer.Start();
        }
        
        /*執行的事件*/
        public void theout(object source, EventArgs  e)
        {
        	//這裡單獨開一個執行緒用來顯示資訊
        	try{
	        	Thread t1 = new Thread(new ThreadStart(readMsg));
	        	t1.Start();
        	}catch(Exception)
        	{
        	}
        }
        void readMsg()
        {
        	if(tag && tc!=null){
	        	sr = new StreamReader(tc.GetStream());
	        	String msg = sr.ReadLine();
	        	String[] address =  Regex.Split(msg,"<@
[email protected]
>"); chatText.AppendText(address[0].Replace("<br>","\r\n")); address = Regex.Split(address[1],"<@>"); cb_chatList.Items.Clear(); foreach (String s in address) { if(!String.IsNullOrEmpty(s) && s != cl.clientName) cb_chatList.Items.Add(s); } } } void Button1Click(object sender, EventArgs e) { if(String.IsNullOrEmpty(textBox2.Text)){ MessageBox.Show("請輸入訊息");return; } sw = new StreamWriter(tc.GetStream()); sw.WriteLine("<br>"+cl.clientName+"  "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"<br> "+textBox2.Text); textBox2.Text = ""; sw.Flush(); } void Bu_exitClick(object sender, EventArgs e) { MainFormFormClosing(null,null); } void Button2Click(object sender, EventArgs e) { chatText.Text = ""; } void MainFormFormClosing(object sender, FormClosingEventArgs e) { closeWindowTimer.Stop(); cl.Close(); tag = false; if(sr!=null) sr.Close(); if(sw!=null) sw.Close(); } void Bu_simpleClick(object sender, EventArgs e) { String selected = cb_chatList.Text; if(selected==null) { MessageBox.Show("請選擇單聊物件"); return; } } } }

補充:

1:上傳下載檔案、聊天表情、私聊、踢人.......都是可以擴充套件的功能。

只是目前還沒有可執行的思路,希望有相同愛好者多多提出寶貴意見。我會繼續關注。

相關推薦

javac#使用Socket實現區域網聊天

先執行一個java寫的區域網聊天,效果圖如下 後使用c#圖形修改如下: c#程式碼: servlet服務端 using System; using System.Collections.Generic; using System.Drawing; using Sys

從2-3-4樹到紅黑樹(下) JavaC實現

歡迎探討,如有錯誤敬請指正 相關部落格: 1. 實現技巧 為了簡化程式碼和減少不必要的開銷,在具體的實現中我們定義一個偽根節點ROOT且只定義一個NIL節點。偽根節點的左子支永遠指向NIL節點,NIL節點的左右子支又指向它自身。偽根節點的右子支才表示真正的紅黑樹。 2. Java語言實現 packa

javaC# Socket的區別、他們之間的通訊

先看java程式碼 java伺服器端: import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;

關於Javac++隱藏、重寫不同實現機制的探討

tail namespace 文獻 ide archive pretty proc font 分開 一、文章來由 本人如今用c++很多其它。可是曾經Java也寫過不少,Java和c++非常像,可是深入挖一些,Java跟c++的差別非常大,就拿剛剛發的另

[工作小記]JAVAC#的Socket通信

motion pmo sleep ddr trace ktr 不同的 ram target 在日常的開發中,不同的傳感器支持的開發語言常常是不同的。例如Kinect一般是用C++開發的,Leapmotion用JAVA開發比較多。 去年暑假(17年暑假)做的一個項目是:用Le

如何一步步實現JAVAC# AES加密結果相同

實現JAVA與C# AES加密結果相同 最近公司開發一個電池溯源的介面,對方給的是一個java的demo,使用的是AES加密,但是我們的整合平臺是使用C#開發的,所有必須把java中的AES加密方法改成C#實現。對方給的demo如下 /**

Java中使用socket實現客戶端服務端互動

Socket解釋: 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計

javac語言之間的socket通訊—c客戶端java伺服器端

寫在前面的宣告:程式例子均執行在ubuntu(是一個以桌面應用為主的Linux作業系統)上。當然你也可以把java執行在其它系統上,這裡只是為了方便。 上一篇文章已經說明了關於socket的一些知識,but這是遠遠不夠的,我相信只要你感興趣,學習它並不是什麼難事。 好吧,我

Android開發 通過JNI實現JAVAC/C++程式間的呼叫和回撥

       在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互呼叫。        Java Native Interface (JNI)標準是java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行

JavaC#通過Byte[]位元組陣列實現訊息傳遞,跨語言資料序列化

支援型別: byte、short、int、long、float、double、boolean、char、String、byte[] Java程式碼 package com.itshidu.io; import java.nio.charset.Charset;

C#編寫的區域網聊天工具(本菜鳥剛學Socket,拿來分享下~~~)

class Server //服務端方法 { #region 繫結IP、埠 IniOperate io = new IniOperate("C:\\lwj.ini"); public Socket Bind()

C++ socket 實現服務端客戶端互相通訊

// Server.cpp : Defines the entry point for the console application. // #include "winsock2.h" #pragma comment(lib, "ws2_32.lib")

JavaC之間的socket通訊

最近正在開發一個基於指紋的音樂檢索應用,演算法部分已經完成,所以嘗試做一個Android App。Android與伺服器通訊通常採用HTTP通訊方式和Socket通訊方式。由於對web伺服器程式設計瞭解較少,而且後臺伺服器已經採用原始socket實現與c客戶端通訊,這就要求

Unity C#伺服器 實現Socket的UDP通訊(多客戶端)

前言 上一篇簡單的介紹了下Unity客戶端和伺服器的Socket通訊,但是還不能實現多個客戶端與伺服器的通訊,所以今天在這邊把前面的工程完善一下(使用的是上篇講到的UdpClient類來實現),實現多個客戶端與伺服器的udp通訊。效果圖如下,兩個客戶端可以向伺服器傳送訊息,

Java中利用socket實現簡單的服務端客戶端的通訊(入門級)

Java程式設計中,要想要使用網路通訊,就離不開Socket程式設計,在此對socket進行簡單的介紹。首先宣告,這是一個入門級的介紹,僅僅簡單的實現了客戶端向服務端傳送資料,服務端正常的接收資料,當接收到特定的資料時,服務端和客戶端都關閉,一個服務端對應一個客戶端,不涉及

Java中利用socket實現簡單的服務端客戶端的通訊(基礎級)

在上一篇文章中,簡單的介紹了java中入門級的socket程式設計,簡單的實現了客戶端像伺服器端傳送資料,伺服器端將資料接收並顯示在控制檯,沒有涉及多執行緒。上一篇文章的連結:Java中利用socket實現簡單的服務端與客戶端的通訊(入門級) 這次,我們將上一節中的程式碼進

JAVAC++用socket通訊出現中文亂碼

java接收C++資料出現中文亂碼: 將java這邊的socket編碼改為GBK就行了! java和C++使用Socket通訊,其實底層Socket都是相通的,所以只需要按照各自的語法去做就是了。 java伺服器端使用ServerSocket的accept建立S

使用C#+socket實現用移動設備控制的虛擬手柄

sock endpoint network 回車 byte arraylist program 行處理 favor 最近在和同學玩死神vs火影。以懷念小時候,突然認為用鍵盤玩的不夠暢快,因此萌生了寫一個虛擬手柄的念頭。 我的思路是在移動設備(iOS、Android)上實

Unity3d 腳本C#Socket服務器傳輸數據

type ucc 字符串 ror callback internet cli 異步 spa Test.cs腳本 ---------------------------------------------------------------------------------

JAVAC++,CC++的差別

-m content 才幹 hit 沒有 span 自增 ng- data- 首先來分析JAVA與C++的差別: JAVA是純面向對象的語言,而C++是基於面向對象過程的語言。 JAVA有著垃圾回收機制。它的語法是C+&#