① 用Socket编程实现一个基于C/S的应用
例子一:
1 客户端的程序
package net3;
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args){
try{
System.out.println("连接到服务器");
Socket s=new Socket("localhost",4005);
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
String str="";
String sss="";
while(true)
{
str=b.readLine();
pw.println(str);
pw.flush();
//不理睬大小写转换
if(str.equalsIgnoreCase("stop"))
{
System.out.println("服务停止");
break;
}
sss=br.readLine();
System.out.println(sss);
if(sss.equalsIgnoreCase("stop"))
{
System.out.println("服务停止");
break;
}
}
b.close();
br.close();
pw.close();
}
catch(IOException e){}
}
}
2 服务器端的程序:
package net3;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args){
try{
System.out.println("服务器正在启动....");
ServerSocket ss=new ServerSocket(4005);
System.out.println("服务器启动,等待服务...");
Socket s=ss.accept();
BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter bw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
String str="";
String sss="";
while(true)
{
sss=br.readLine();
System.out.println(sss);
if(sss.equalsIgnoreCase("stop"))
{
System.out.println("服务停止");
break;
}
str=r.readLine();
bw.println(str);
bw.flush();
//不理睬大小写转换
if(str.equalsIgnoreCase("stop"))
{
System.out.println("服务停止");
break;
}
}
br.close();
r.close();
bw.close();
}
catch(IOException e){}
}
}
例子二:
package test.socket;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TalkMe {
public static void main(String[] args) {
System.out.println("请输入:IP地址:");
TalkMe talk = new TalkMe();
talk.listener().start();
try {
talk.talker(new BufferedReader(new InputStreamReader(System.in)).readLine()).start();
} catch (IOException e) {
e.printStackTrace();
}
}
private Thread listener(){
return new Thread() {
public void run() {
DataInputStream dataIS = null;
String clientSay;
try {
ServerSocket server = new ServerSocket(9666);
Socket socket = server.accept();
while (true) {
dataIS = new DataInputStream(socket.getInputStream());
clientSay = dataIS.readLine();
System.out.println("Other say:" + clientSay);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
private Thread talker(final String ip){
return new Thread(){
public void run() {
Socket socket = null;
InputStreamReader stdin=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(stdin);
DataInputStream dataIS = new DataInputStream(System.in);
OutputStream os;
PrintStream ps;
String say = "";
boolean flag = true;
while (flag) {
if (flag)
System.out.println("connection ....");
try {
socket = new Socket(ip, 9666);
System.out.println("connection ok.");
flag = true;
os = socket.getOutputStream();
ps = new PrintStream(os);
while (true) {
say = dataIS.readLine();
ps.println(say);
}
} catch (UnknownHostException e) {
try {
sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
} catch (IOException e) {
}
}
}
};
}
}
② 用java做cs项目一定会用到socket编程吗
一般都会,当然会用一些框架的话 不需要接触到那么底层的东西
③ java socket编程cs无法连接
不知道你的无法连接是怎么判断的(先启动服务端,再启动客户端),我这里是可以连接的(用127.0.0.1本地测试,改成本地真实IP也是可以的);如果你的无法连接是以没有收到客户端发的消息,那么就不对了,其实已经连接上了,只不过你的代码服务端和客户端有各种阻塞问题,写得不对,导致程序一直“卡”在某个地方,所以没有任何消息显示出来。如果不用线程的话,服务端和客户端就只能是一对一的对话,而且是你说一句我说一句的情况(因为有阻塞,等待键盘输入或者等待socket流的数据);
楼上那位的代码也没改完,socket = ss.accept(); 这句应该放在循环外面(这句会造成阻塞的,如果放在里面,那么楼上的代码就只能接收一次客户端消息),如果想写成一个服务端接收多个客户端的响应,那么就必须用线程了,把ss.accept()放到主线程(1个);收消息一个线程,发消息一个线程(每个链接对应2个,实现收发,这样就不会造成接收和发送互相影响了,造成等待了)。
while (true)
{
socket = ss.accept();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
String line = in.readLine();
out.println("you input is :" + line);
}
④ c#语言关于socket 的cs通讯
⑤ asp.net用socket给cs服务端发送消息,功能已经实现,但经常丢失数据,能帮我解决再加100分
//客户端代码:
private void ...()
{
string info = "服务端第:" + i + "次发送测试数据!";
IPAddress ip = IPAddress.Parse("121.14.154.38");
Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(new IPEndPoint(ip, 8899), new AsyncCallback(EndConn), null);
}
private void EndConn(IAsyncResult AR)
{
socket.EndConnect(AR);
string sendStr = info;
byte[] bs = Encoding.Default.GetBytes(sendStr); //转换编码
int resver = socket.Send(bs, bs.Length, 0); //发送消息
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
//服务端:
byte[] recvBytes = new byte[1024];
string recvStr = "";
private void ...()
{
IPAddress ip = IPAddress.Parse(strIP);
IPEndPoint ipe = new IPEndPoint(ip, 8889);
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipe); //绑定IP和端口
socket.Listen(5); //开始监听
temp = socket.Accept();
recvBytes = new byte[1024];
temp.BeginReceive(recvBytes, 0, recvBytes.Length, 0, new AsyncCallback(EndRecv), null); //从客户端接收消息
}
private void EndRecv(IAsyncResult AR)
{
int bytes = temp.EndReceive(AR);
recvStr += Encoding.Default.GetString(recvBytes, 0, bytes);
temp.BeginReceive(recvBytes, 0, recvBytes.Length, 0, new AsyncCallback(EndRecv), null); //从客户端接收未发完的消息
}
丢失数据可能是两个原因造成的:
一.你的发送和接收都设置了超时,可能在数据还没有发送或接收完毕就停止
了。我帮你把Socket操作改成异步的了,这样不用设置超时也不会阻塞你的
主线程;
二.接收数据的时候,你只收一次,也就是只接收了一个缓冲区大小的数据,这
也可能造成数据丢失;
PS:因为没有你的源码,这段代码是我随手改的,没有调试过,有什么问题的话
请说明。
⑥ c++有何技术可以实现cs架构,比如socket
如果数据库开放,并且在服务器端不需要做其他处理,直接insert吧。
如果还需要在服务器端decode,正常的网络通信就可以:服务器端开监听端口,客户端把收集到的信息发过去,服务器端做信息处理,入库。这中间的技术都是最基础的,c++/c网络编程。
⑦ 用Java的socket编程实现c/s结构程序
今天太晚了,改天给你做一个,记得提醒我,这个如果只是要个简单的,我半个小时就搞定了
给我个邮箱
现在给贴出我的代码: 整个结构分两个工程
1。服务端工程NioServer.java: 采用nio 方式的异步socket通信,不仅可以实现你的服务器还可以让你多学习一下什么是nio
2。客户端工程UserClient.java: 采用Swing技术画了一个简单的UI界面,比较土,原因是我没那么多时间去设计界面,你需要的话可以自己去修改得漂亮点,相信不难
现在贴工程1:
package com.net;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NioServer {
public static final int SERVERPORT=5555;
public static final String USERNAME="wangrong";
public static final String PASSWORD="123456";
public static final String ISACK="ACK";
public static final String ISNAK="NAK!";
// Selector selector;//选择器
// SelectionKey key;//key。 一个key代表一个Selector 在NIO通道上的注册,类似主键;
// //取得这个Key后就可以对Selector在通道上进行操作
private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );// 通道数据缓冲区
public NioServer(){
}
public static void main(String[] args) throws IOException {
NioServer ns=new NioServer();
ns.BuildNioServer();
}
public void BuildNioServer() throws IOException{
/////////////////////////////////////////////////////////
///////先对服务端的ServerSocket进行注册,注册到Selector ////
/////////////////////////////////////////////////////////
ServerSocketChannel ssc = ServerSocketChannel.open();//新建NIO通道
ssc.configureBlocking( false );//使通道为非阻塞
ServerSocket ss = ssc.socket();//创建基于NIO通道的socket连接
//新建socket通道的端口
ss.bind(new InetSocketAddress("127.0.0.1",SERVERPORT));
Selector selector=Selector.open();//获取一个选择器
//将NIO通道选绑定到择器,当然绑定后分配的主键为skey
SelectionKey skey = ssc.register( selector, SelectionKey.OP_ACCEPT );
////////////////////////////////////////////////////////////////////
//// 接收客户端的连接Socket,并将此Socket也接连注册到Selector ////
///////////////////////////////////////////////////////////////////
while(true){
int num = selector.select();//获取通道内是否有选择器的关心事件
if(num<1){continue; }
Set selectedKeys = selector.selectedKeys();//获取通道内关心事件的集合
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {//遍历每个事件
try{
SelectionKey key = (SelectionKey)it.next();
//有一个新联接接入事件,服务端事件
if ((key.readyOps() & SelectionKey.OP_ACCEPT)
== SelectionKey.OP_ACCEPT) {
// 接收这个新连接
ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel();
//从serverSocketChannel中创建出与客户端的连接socketChannel
SocketChannel sc = serverChanel.accept();
sc.configureBlocking( false );
// Add the new connection to the selector
// 把新连接注册到选择器
SelectionKey newKey = sc.register( selector,
SelectionKey.OP_READ );
it.remove();
System.out.println( "Got connection from "+sc );
}else
//读客户端数据的事件,此时有客户端发数据过来,客户端事件
if((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ){
// 读取数据
SocketChannel sc = (SocketChannel)key.channel();
int bytesEchoed = 0;
while((bytesEchoed = sc.read(echoBuffer))> 0){
System.out.println("bytesEchoed:"+bytesEchoed);
}
echoBuffer.flip();
System.out.println("limet:"+echoBuffer.limit());
byte [] content = new byte[echoBuffer.limit()];
echoBuffer.get(content);
String result=new String(content);
doPost(result,sc);
echoBuffer.clear();
it.remove();
}
}catch(Exception e){}
}
}
}
public void doPost(String str,SocketChannel sc){
boolean isok=false;
int index=str.indexOf('|');
if(index>0){
String name=str.substring(0,index);
String pswd=str.substring(index+1);
if(pswd==null){pswd="";}
if(name!=null){
if(name.equals(USERNAME)
&& pswd.equals(PASSWORD)
){
isok=true;
}else{
isok=false;
}
}else{
isok=false;
}
}else{
isok=false;
}
String result="";
if(isok){
result="ACK";
}else{
result="NAK!";
}
ByteBuffer bb = ByteBuffer.allocate( result.length() );
bb.put(result.getBytes());
bb.flip();
try {
sc.write(bb);
} catch (IOException e) {
e.printStackTrace();
}
bb.clear();
}
}
下面贴工程2
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class UserClient implements ActionListener{
JFrame jf;
JPanel jp;
JLabel label_name;
JLabel label_pswd;
JTextField userName;
JButton jb;
JPasswordField paswrd;
JLabel hintStr;
public UserClient (){
jf=new JFrame("XXX 登陆系统");
jp=new JPanel();
jf.setContentPane(jp);
jf.setPreferredSize(new Dimension(350,220));
jp.setPreferredSize(new Dimension(350,220));
jp.setBackground(Color.gray);
label_name=new JLabel();
label_name.setPreferredSize(new Dimension(150,30));
label_name.setText("请输入帐户(数字或英文):");
userName=new JTextField();
userName.setPreferredSize(new Dimension(150,30));
jp.add(label_name);
jp.add(userName);
label_pswd=new JLabel();
label_pswd.setPreferredSize(new Dimension(150,30));
label_pswd.setText("请输入密码:");
jp.add(label_pswd);
paswrd=new JPasswordField();
paswrd.setPreferredSize(new Dimension(150,30));
jp.add(paswrd);
jb=new JButton("OK");
jb.setPreferredSize(new Dimension(150,30));
jb.setText("确 定");
jb.addActionListener( this);
jp.add(jb);
hintStr=new JLabel();
hintStr.setPreferredSize(new Dimension(210,40));
hintStr.setText("");
hintStr.setForeground(Color.RED);
jp.add(hintStr);
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private String name;
private String pswd;
public void actionPerformed(ActionEvent e) {
name=userName.getText().trim();
pswd=new String(paswrd.getPassword());
if(pswd==null){
pswd="";
}else{
pswd=pswd.trim();
}
if(name!=null && name.length()>0){
hintStr.setText("正在验证客户端,请稍候...");
start();
}
}
OutputStream os;
Socket s;
InputStream is;
public void start(){
//建立联网线程
new Thread(new Runnable(){
public void run() {
try {
s=new Socket("127.0.0.1",5555);
//写
os=s.getOutputStream();
os.write(name.getBytes());
os.write('|');//用户名与密码用"|"分隔
os.write(pswd.getBytes());
os.flush();
//读内容
Thread.sleep(1000);
is=s.getInputStream();
int len=is.available();
System.out.println("len:"+len);
byte[] bytes=new byte[len];
is.read(bytes);
String resut=new String(bytes);
System.out.println("resut:"+resut);
//TODO 这里通过返回结果处理
if(resut.equals("ACK")){
hintStr.setText("验证成功,欢迎光临!");
}else{
paswrd.setText(null);
hintStr.setText("用户名或密码错误,请重新输入");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
// try {
// os.close();
// is.close();
// s.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
}
}).start();
}
public static void main(String[] args) {
new UserClient();
}
}
⑧ 基于socket 的C/S 程序如何在同一台机器上实现通信
为什么客户端和服务端使用同一个端口号,使用同一个端口号当然不能正常通信啊,在同一台机器上,一个端口号只能是属于一个进程。你的客户端的端口号应该是让系统自动分配
⑨ 用C#编写服务器的socket模块,按照‘C#基于Socket的CS模式的完整例子’上面的内容进行调试,出现两个问题
是点击关闭后仍旧在调试---这个问题是你在关闭的时候没有退出线程,你需要在close事件里关闭socket,退出线程,或者直接调用你的Dispose方法
客户端收不到消息因为你没贴客户端的源码,看不出是什么问题