用Socket编程实现一个基于CS的应用

用Socket编程实现一个基于CS的应用,第1张

例子一:

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) {

}

}

}

}

}

}

今天太晚了,改天给你做一个,记得提醒我,这个如果只是要个简单的,我半个小时就搞定了

给我个邮箱

现在给贴出我的代码: 整个结构分两个工程

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="wangzhirong"

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()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11069863.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存